解析包含可变字段的文本文件 Vb.Net

Parse Text File with Variable Fields Vb.Net

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

~ENT*1*2J*34*111223333
~NM1*IL*1*SMITHJOHNA***N*123456789
~RMRIKH62XX/PAY/1234567/20150103**12345.67
~REFZZMEDPM/M/12345.67
~REF*LU*40/CSWI
~DTM*582****RD8*20150101-20150131

~ENT*2*2J*34*222334444
~NM1*IL*1*DOEJANES***N*234567891
~RMRIKH62XX/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
~RMRIKH62XX/PAY/200462975/20150103**45678.90
~REFZZMEDPM/M/3456.78
~REF*LU*40/CSWI
~DTM*582****RD8*20150101-20150131

~ENT*4*2J*34*444556666
~NM1*IL*1*SMITHJANED***N*456789012
~RMRIKH62XX/PAY/567890123/678901234* *6789.01
~REFZZMEDPM/M/6789.01
~REF*LU*40/CSWI
~DTM*582****RD8*20150101-20150131

~ENT*5*2J*34*666778888
~NM1*IL*1*SMITHJONJ***N*8901234
~RMRIKH62XX/PAY/56789012/67890123**5678.90
~REFZZMEDPM/M/5678.90
~REF*LU*40/CSWI
~DTM*582****RD8*20150101-20150131

~ENT*6*2J*34*777889999
~NM1*IL*1*DOEBOBE***N*567890123
~RMRIKH62XX/PAY/34567890/45678901*5678.90
~REF*LU*40/CSWI
~DTM*582****RD8*20141210-20141231
~RMRIKH62XX/PAY/1234567890/2345678901**6789.01
~REFZZMEDPM/M/6789.01
~REF*LU*40/CSWI
~DTM*582****RD8*20150101-20150131

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

String.Split是你的朋友。

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

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

您可以很容易地将其放入二维数组中:

' 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()

现在只需遍历二维结构并相应地处理数据。

如果您需要确保您的数据始终具有特定数量的索引(例如,某些行提供了 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("*"))