.net 使用split逐行解析文本文件
我有一个文本文件,看起来像这样:.net 使用split逐行解析文本文件,.net,vb.net,.net,Vb.net,我有一个文本文件,看起来像这样: Name : <John Doe> First field in group Rank : <Private> DOB : <1/25/92> etc etc etc 55 more fields Retired : <Y> Last field in group 名称:组中的第一个字段 排名: 出生日期: 等 等 等 55多个领域 已退休:组中的最后一个字段 第2部分类似于: Ad
Name : <John Doe> First field in group
Rank : <Private>
DOB : <1/25/92>
etc
etc
etc
55 more fields
Retired : <Y> Last field in group
名称:组中的第一个字段
排名:
出生日期:
等
等
等
55多个领域
已退休:组中的最后一个字段
第2部分类似于:
Additional Data 1
field 1 : <some data>
field 2 : <more data>
field 3 : <still more data>
Additional Data 2
field 1 : <some data>
field 2 : <more data>
field 3 : <still more data>
Additional Data 3
field 1 : <some data>
field 2 : <more data>
field 3 : <still more data>
.... up to 10 groups of additional data
附加数据1
字段1:
字段2:
字段3:
补充数据2
字段1:
字段2:
字段3:
补充数据3
字段1:
字段2:
字段3:
.... 最多10组附加数据
我正在使用StreamReader读取文件,没有问题
我使用split函数提取字段名和字段值,没有问题。
我的表格上有61个字段,它们的名称是fld_1、fld_2、fld_3等
我的问题是试图用每个值填充表单,并在最后一个字段“Retired”处停止
我尝试过使用StreamReader和split,它是获取字段值并将其放入表单上相应的文本框中
Public Sub reader()
Dim x as Interger = 1
Using objReader as New StreamReader("C:\temp\testFile.txt")
Do While objReader.Peek() <> -1
Dim line As String = objReader.ReadLine()
If line.Contains(":") Then
Dim splitLine() as String = line.Split(":")
Dim fieldName as String = splitLine(0)
Dim fieldValue as String = splitLine(1)
Dim txtBox as TextBox
Dim name As String = "fld_" * x.ToString
txtBox = Controls.Item(name)
txtBox.Text = fieldValue
If Not objReader.EndOfStream then
line = objReader.ReadLine
End If
End If
x = x + 1
Loop
End Using
End Sub
公共子读取器()
尺寸x为整数=1
使用objReader作为新的StreamReader(“C:\temp\testFile.txt”)
Do While objReader.Peek()-1
作为字符串的尺寸线=objReader.ReadLine()
如果行包含(“:”),则
Dim splitLine()为字符串=line.Split(“:”)
Dim字段名为字符串=拆分线(0)
尺寸字段值为字符串=分割线(1)
将txtBox设置为文本框
尺寸名称为String=“fld_u2;”*x.ToString
txtBox=控件。项(名称)
txtBox.Text=字段值
如果不是objReader.EndOfStream,则
line=objReader.ReadLine
如果结束
如果结束
x=x+1
环
终端使用
端接头
您实际上没有检查从文件中读取的行的内容。记录的起始行包含
名称
,最后一行包含失效
。让我们查找这些字符串,并在找到时执行所需的操作
我认为这是一个打字错误;尝试乘以字符串并没有那么有用:
Dim name As String = "fld_" * x.ToString
使用语句初始化:需要释放此对象。
启动一个循环,读取文本行,直到找到记录的开头或StremReader到达文件的结尾;在这种情况下,请退出该过程
然后,继续阅读几行文本,直到找到一行失效的
Private Sub fileReader(filePath as String)
Dim comp = StringComparison.InvariantCultureIgnoreCase
Dim lineContent As String = String.Empty
Dim line As Integer = 1
Using reader = New StreamReader(filePath)
Do
lineContent = reader.ReadLine
Loop While Not (reader.EndOfStream OrElse lineContent.StartsWith("Name", comp))
If reader.EndOfStream Then Return
Controls($"fld_{line}").Text = lineContent.Split(":"c)(1).Trim()
While Not lineContent.StartsWith("Retired", comp)
line += 1
lineContent = reader.ReadLine
Controls($"fld_{line}").Text = lineContent.Split(":"c)(1).Trim()
End While
End Using
End Sub
这行代码使用字符串插值:
Controls($"fld_{line}").Text = ...
在VB.Net版本不允许的情况下,请使用string.Format()
:
欢迎来到堆栈溢出。你提到了一个错误。这是什么错误,你知道在你的代码中它在哪里被触发吗?就目前情况而言,要准确地找到你在问题中提出的问题有点困难。你打算每隔一行处理一次吗?代码中有两个
objReader.ReadLine
。不,这不是我的目的,我想找到开始字段“Name”并进行解析,直到它到达结束字段“Retired”。文件结构的描述应该更清晰。在以name
开头的那一行之前还有其他行吗?在失效的一行之后还有其他行吗?是什么将字段名与其值分开的?这些是空格还是选项卡
?您是否可以使用DataGridView(或ListView)来显示数据,而不是使用一堆文本框?是否允许用户编辑数据并保存更改(这会影响文本行的处理方式)?添加可以帮助他人帮助您的详细信息。除了文件顶部的一些空行外,只有一个记录实例以名称开头,以Retired结尾。将字段名与字段值分开,文件格式在10年内没有改变,所以我不担心它会改变,有61个字段组成一个记录,我在表格上的字段名是fld_1、fld_2、fld_3…fId_61。我想我可以做一个for循环,每次它通过循环时,它都会抓取字段值并将其放入适当的表单字段。我在这里被绊倒了:控件(String.Format(“fld_{0}”,line)).Text=lineContent我得到NullReferenceException…对象引用未设置…line=1和lineContent=“John doe”我插入了一个通用名。现在替换为您提供的。谢谢,先生,我已经捕捉到了这一点,并将我的更改为fld_u。更改后,我仍然会收到错误。那么您的文本框的名称是什么?这些控件是表单的子控件,还是将它们放在面板或其他容器中?如果是这样,则需要使用容器的集合。e、 g<代码>面板1.控件(…)
我刚刚仔细检查了一下,我所有的字段名实际上都是fld_1。。fld_61,啊,我的文本框在TabControl1上。对不起,我错过了。
Controls(String.Format("fld_{0}", line)).Text = ...