首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用可变字段解析文本文件Vb.Net

使用可变字段解析文本文件Vb.Net
EN

Stack Overflow用户
提问于 2015-01-22 17:06:13
回答 2查看 775关注 0票数 0

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

~ENT*1*2J*34*111223333

~NM1*IL*1*SMITH_JOHN_A***N*123456789

~RMR_IK_H62XX/PAY/1234567/20150103**12345.67

~REF_ZZ_MEDPM/M/12345.67

~参*LU*40/CSWI

~DTM*582*RD8 8*20150101-20150131

~耳鼻喉科*2*2J*34*222334444

~NM1*IL*1*DOE_JANE_S***N*234567891

~RMR_IK_H62XX/PAY/1234567/345678901**23456.78

~参*LU*40/CSWI

~DTM*582*RD8 8*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

~参*LU*40/CSWI

~DTM*582*RD8 8*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

~参*LU*40/CSWI

~DTM*582*RD8 8*20150101-20150131

~耳鼻喉科*5*2J*34*666778888

~NM1*IL*1*SMITH_JON_J***N*8901234

~RMR_IK_H62XX/PAY/56789012/67890123**5678.90

~REF_ZZ_MEDPM/M/5678.90

~参*LU*40/CSWI

~DTM*582*RD8 8*20150101-20150131

~耳鼻喉科*6*2J*34*777889999

~NM1*IL*1*DOE_BOB_E***N*567890123

~RMR_IK_H62XX/PAY/34567890/45678901*5678.90

~参*LU*40/CSWI

~DTM*582*RD8 8*20141210-20141231

~RMR_IK_H62XX/PAY/1234567890/2345678901**6789.01

~REF_ZZ_MEDPM/M/6789.01

~参*LU*40/CSWI

~DTM*582*RD8 8*20150101-20150131

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-22 17:14:45

String.Split是你的朋友。

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-01-22 17:18:48

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

代码语言:javascript
运行
复制
' 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命令如下:

代码语言:javascript
运行
复制
' 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("*"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28094606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档