解析带有可变字段Vb.Net的文本文件

时间:2015-01-22 17:06:13

标签: vb.net parsing

我处理的文本文件在数据格式化方式上发生了变化,因此是时候更新解析它的代码了。旧文件每条记录都有固定数量的行和字段,因此按位置解析很容易,当然现在情况并非如此(为了便于阅读,我添加了空格,〜表示新行,*是字段分隔符):

~ENT * * 1 * 2J * 34 * 111223333
~NM1 * IL * 1 * SMITH JOHN A *** N * 123456789
~RRR IK H62XX / PAY / 1234567/20150103 ** 12345.67
~REF ZZ MEDPM / M / 12345.67
~REF * LU * 40 / CSWI
~DTM * 582 **** RD8 * 20150101-20150131

~ENT * 2 * 2J * 34 * 222334444
~NM1 * IL * 1 * DOE JANE S *** N * 234567891
~RMR IK H62XX / PAY / 1234567/345678901 ** 23456.78 ~REF * LU * 40 / CSWI
〜DTM * 582 **** RD8 * 20141211-20141231

~ENT * 3 * 2J * 34 * 333445555
~NM1 * IL * 1 * DOE * JOHN **** N * 3456789012
~RMR IK H62XX / PAY / 200462975/20150103 ** 45678.90
~REF ZZ MEDPM / M / 3456.78
~REF * LU * 40 / CSWI
〜DTM * 582 **** RD8 * 20150101-20150131

~ENT * 4 * 2J * 34 * 444556666
~NM1 * IL * 1 * SMITH JANE D *** N * 456789012
~RMR IK H62XX / PAY / 567890123/678901234 ** 6789.01 ~REF ZZ MEDPM / M / 6789.01
~REF * LU * 40 / CSWI
〜DTM * 582 **** RD8 * 20150101-20150131

~ENT * 5 * 2J * 34 * 666778888
~NM1 * IL * 1 * SMITH JON J *** N * 8901234
~RRR IK H62XX / PAY / 56789012/67890123 ** 5678.90
~REF ZZ MEDPM / M / 5678.90
~REF * LU * 40 / CSWI
〜DTM * 582 **** RD8 * 20150101-20150131

~ENT * 6 * 2J * 34 * 777889999
~NM1 * IL * 1 * DOE BOB E *** N * 567890123
~RRR IK H62XX / PAY / 34567890/45678901 * 5678.90
~REF * LU * 40 / CSWI
~DTM * 582 **** RD8 * 20141210-20141231
~RMR IK H62XX / PAY / 1234567890/2345678901 ** 6789.01
~REF ZZ MEDPM / M / 6789.01
~REF * LU * 40 / CSWI
〜DTM * 582 **** RD8 * 20150101-20150131

解析此数据的最佳方法是什么?有没有比使用StreamReader更好的方法?

2 个答案:

答案 0 :(得分:2)

String.Split是你的朋友。

如果文件不是太大,最简单的方法是:

  • 将文件内容读入字符串变量(File.ReadAllText)。
  • 拆分“行”(lines = allText.Split("~"c))。
  • 循环线。对于每一行:
    • 将该行拆分为字段(fields = line.Split("*"c)
    • 处理字段值。您可能希望在Select Case上有一个很大的fields(0)语句,然后根据该行的第一个字段继续。

答案 1 :(得分:2)

你可以很容易地将它变成二维阵列:

' Dynamic structure to hold the data as we go.
Dim data As New List(Of String())

' Break each delimiter into a new line.
Dim lines = System.IO.File.ReadAllText("data.txt").Split("~")

' Process each line.
For Each line As String In lines
    ' Break down the components of each line.
    data.Add(line.Split("*"))
Next

' Produce 2-D array. Not really needed, as you can just use data if you want.
Dim dataArray = data.ToArray()

现在只需迭代2-D结构并相应地处理数据。

如果您需要确保您的数据总是具有特定数量的索引(例如,某些行提供了5个字段,但您希望总是有8个字段),则可以调整data.Add这样的命令:

' Ensure there are always at least 8 indexes for each line.
' This will insert blank (String.Empty) values into the array indexes if a line of data omits certain values.
data.Add((line & Space(8).Replace(" ", "*")).Split("*"))