使用split逐行解析文本文件

时间:2019-06-18 23:01:35

标签: .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

第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

我正在使用StreamReader读取文件,那里没有问题 我正在使用split函数提取字段名称和字段值,那里没有问题。 我在表单上有61个字段,它们的名称分别是fld_1,fld_2,fld_3等 我的问题是尝试使用每个值填充表单,并在最后一个字段“退休”处停止

我尝试使用StreamReader进行拆分,它采用fieldValue并将其放在表单上的适当文本框中。

    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

1 个答案:

答案 0 :(得分:1)

您实际上并没有检查从文件读取的行的内容。
记录的起始行包含 Name ,最后一条包含 Retired 。让我们查找这些字符串,并在找到它们时执行所需的操作。

我认为这是一个错字;尝试将字符串相乘不是那么有用:

Dim name As String = "fld_" * x.ToString

使用StreamReader语句初始化using:需要处理该对象。 启动一个循环以读取文本行,直到找到记录的开始或StremReader到达文件的末尾为止;在这种情况下,请退出该过程。

然后,继续阅读文本行,直到找到StartsWith() Retired的行。

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

Controls(String.Format("fld_{0}", line)).Text = ...