解析设置宽度的文本文件
Parsing Set Width Text File
我正在寻找一些关于如何从 PBX 收到的用于报告的平面文本文件解析 CDR 数据的指导。这些文件设置了宽度而不是使用定界符。
我找到了一个叫做文本字段解析器的东西,但想知道是否有更好、更简单的方法。
http://csharphelper.com/blog/2017/02/use-a-textfieldparser-to-read-fixed-width-data-c/
我在下面添加了一些来自供应商的示例,以便您了解确切的格式和字段的含义。
例子
以下是外部 SMDR 记录的示例:
01/14 09:24 00:00:59 T201 003 P001 100 1011T 1405
其中,01/14 是来电者联系您的联络中心的日期 09:24 是来电的时间 00:00:59 是座席在转接电话之前与来电者通话的时间T201 是呼叫者拨入的中继号码 003 是代理应答的时间(不是排队时间)P001 是呼叫排队的 ACD 路径队列的报告号码 100 是报告号码坐席组的编号1011为最先接听电话的坐席IDT为转接呼叫标识1405为转接的坐席ID
这意味着外部呼叫者于 1 月 14 日 9:24 上午拨入了中继线 201 上的联络中心。呼叫排队到 ACD 路径队列 1(显示为 P001),排队到座席组 100,并在排队等待 3 秒后由座席 1011 应答。接听电话的座席与客户交谈了 59 秒,然后将电话转给座席 1405。
内部 SMDR 记录
内部 SMDR 记录由 PBX 在以下情况下生成
1. PBX 上的两个设备(分机或座席)之间的呼叫完成(即,当所有参与呼叫的各方都挂断时),呼叫中没有外部各方(中继) 2. 呼叫是内部应答仅呼叫 3. 对 ACD 队列的呼叫报告基于队列的可拨号码,而不是在外部 SMDR 记录中找到的报告号码。 4. 呼叫中的所有各方都将其 Class 服务设置为启用 SMDR 内部录音5. PBX 启用了内部 SMDR 选项。
例子
以下是内部 SMDR 记录的示例:
01/14 07:20 00:00:10 6979 002 6515 I 7015
其中,1/14 是拨打电话的日期 07:20 是拨打电话的时间 00:00:10 是通话时长 6979 是从 002 拨打电话的分机号是座席接听的时间(不是在队列中花费的时间) 6515 是呼叫的 ACD 队列的可拨号码 I 是内部呼叫标识符 7015 是接听电话的座席的 ID
这意味着在 1 月 14 日上午 7:20,内部分机 6979 拨打了 ACD 队列 P001,可拨号码为 6515。等待 2 秒后坐席 7015 接听了该呼叫。双方谈了10秒。本次通话没有外部来电者参与
我希望能够解析上面的 CDR/SMDR 数据并将其放入数据库以便进行报告。我可以很容易地使用 CSV 数据执行此操作,但只需要一些有关使用设置宽度数据执行此操作的最佳方法的指导。
对于固定宽度解析,您需要使用 String.Substring()
。 Reference to the MS Docs.
在您的示例中,您将按照以下方式做一些事情(注意:我可能会偏离一个,但您应该了解总体情况)
var line = "01/14 09:24 00:00:59 T201 003 P001 100 1011T 1405";
//If we think about the string as an array then:
//we start at index 0 and continue until we get to index 4.
var date = line.Substring(0,4) //This will be 01/14 as a string.
//We start at index 5 and continue until we get to index 10.
var time = line.Substring(5,10) //This shooould be 09:24 as a string.
您将以这种方式继续,直到从该行中获得您想要的所有数据。
我正在寻找一些关于如何从 PBX 收到的用于报告的平面文本文件解析 CDR 数据的指导。这些文件设置了宽度而不是使用定界符。
我找到了一个叫做文本字段解析器的东西,但想知道是否有更好、更简单的方法。
http://csharphelper.com/blog/2017/02/use-a-textfieldparser-to-read-fixed-width-data-c/
我在下面添加了一些来自供应商的示例,以便您了解确切的格式和字段的含义。
例子
以下是外部 SMDR 记录的示例:
01/14 09:24 00:00:59 T201 003 P001 100 1011T 1405
其中,01/14 是来电者联系您的联络中心的日期 09:24 是来电的时间 00:00:59 是座席在转接电话之前与来电者通话的时间T201 是呼叫者拨入的中继号码 003 是代理应答的时间(不是排队时间)P001 是呼叫排队的 ACD 路径队列的报告号码 100 是报告号码坐席组的编号1011为最先接听电话的坐席IDT为转接呼叫标识1405为转接的坐席ID
这意味着外部呼叫者于 1 月 14 日 9:24 上午拨入了中继线 201 上的联络中心。呼叫排队到 ACD 路径队列 1(显示为 P001),排队到座席组 100,并在排队等待 3 秒后由座席 1011 应答。接听电话的座席与客户交谈了 59 秒,然后将电话转给座席 1405。 内部 SMDR 记录 内部 SMDR 记录由 PBX 在以下情况下生成 1. PBX 上的两个设备(分机或座席)之间的呼叫完成(即,当所有参与呼叫的各方都挂断时),呼叫中没有外部各方(中继) 2. 呼叫是内部应答仅呼叫 3. 对 ACD 队列的呼叫报告基于队列的可拨号码,而不是在外部 SMDR 记录中找到的报告号码。 4. 呼叫中的所有各方都将其 Class 服务设置为启用 SMDR 内部录音5. PBX 启用了内部 SMDR 选项。
例子
以下是内部 SMDR 记录的示例:
01/14 07:20 00:00:10 6979 002 6515 I 7015
其中,1/14 是拨打电话的日期 07:20 是拨打电话的时间 00:00:10 是通话时长 6979 是从 002 拨打电话的分机号是座席接听的时间(不是在队列中花费的时间) 6515 是呼叫的 ACD 队列的可拨号码 I 是内部呼叫标识符 7015 是接听电话的座席的 ID 这意味着在 1 月 14 日上午 7:20,内部分机 6979 拨打了 ACD 队列 P001,可拨号码为 6515。等待 2 秒后坐席 7015 接听了该呼叫。双方谈了10秒。本次通话没有外部来电者参与
我希望能够解析上面的 CDR/SMDR 数据并将其放入数据库以便进行报告。我可以很容易地使用 CSV 数据执行此操作,但只需要一些有关使用设置宽度数据执行此操作的最佳方法的指导。
对于固定宽度解析,您需要使用 String.Substring()
。 Reference to the MS Docs.
在您的示例中,您将按照以下方式做一些事情(注意:我可能会偏离一个,但您应该了解总体情况)
var line = "01/14 09:24 00:00:59 T201 003 P001 100 1011T 1405";
//If we think about the string as an array then:
//we start at index 0 and continue until we get to index 4.
var date = line.Substring(0,4) //This will be 01/14 as a string.
//We start at index 5 and continue until we get to index 10.
var time = line.Substring(5,10) //This shooould be 09:24 as a string.
您将以这种方式继续,直到从该行中获得您想要的所有数据。