.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 = ...