通过文本文件逐行读取异常长时间

时间:2016-09-30 13:50:18

标签: .net vb.net visual-studio streamreader

我遇到一个问题,我需要逐行读取文本文件,并且如果满足某些条件,则将每行放入一个字符串或另一个字符串中。我遇到的问题是它花了很长时间,我只是想知道是否有更快捷的做事方式。我已经做了很多关于如何做到这一点的研究,这是我能想到的最好的。谢谢。 (每次附加两个字符串,因为必须将两个字符串直接输出到文本文件之后)。

内容在一个巨大的文本文件中,其中一条信息从以“aaa”开头的行开头。我必须查看文本文件,通过查找以“aaa”开头的行来分隔这些信息。将一条信息与fullStr1或fullStr2分开的标准是索引29处的字符是空格(“ “) 或不。感谢。

        Using reader As StreamReader = New StreamReader(file)
            Dim line As String = reader.ReadLine
            Do While (Not line Is Nothing)
                If line.Substring(0, 3) = "aaa" AndAlso line.Substring(29, 1) <> " " Then
                    Do
                        fullStr1 = fullStr1 & line & vbCrLf
                        line = reader.ReadLine
                    Loop While (Not line Is Nothing AndAlso line.Substring(0, 3) <> "aaa")
                ElseIf line.Substring(0, 3) = "aaa" AndAlso line.Substring(29, 1) = " " Then
                    Do
                        fullStr2 = fullStr2 & line & vbCrLf
                        line = reader.ReadLine
                    Loop While (Not line Is Nothing AndAlso line.Substring(0, 3) <> "aaa")
                End If
            Loop
        End Using

4 个答案:

答案 0 :(得分:3)

如果您有足够长的文本文件,无论您做什么,都需要一段时间才能扫描。但是,你可以做的一件事应该有所帮助,使用StringBuilder。它正是出于这种情况的目的,比将一条巨大的弦一块一块地拼凑起来效率要高得多。

Dim builder1 As New StringBuilder()
Dim builder2 As New StringBuilder()

Using reader As StreamReader = New StreamReader(file)
   Dim line As String = reader.ReadLine
   Do While (Not line Is Nothing)
      If line.Substring(0, 3) = "aaa" AndAlso line.Substring(29, 1) <> " " Then
         Do
            builder1.AppendLine(line)
            line = reader.ReadLine
         Loop While (Not line Is Nothing AndAlso line.Substring(0, 3) <> "aaa")
      ElseIf line.Substring(0, 3) = "aaa" AndAlso line.Substring(29, 1) = " " Then
         Do
             builder2.AppendLine(line)
             line = reader.ReadLine
         Loop While (Not line Is Nothing AndAlso line.Substring(0, 3) <> "aaa")
      End If
   Loop
End Using

我还要小心你的循环没有得到&#34;卡住&#34;,因为外循环中没有reader.ReadLine调用。如果它进入你在外循环中并且当前行不以&#34; aaa&#34;开头的情况,那么它将永远循环无所事事。你需要做的就是没有&#34; aaa&#34;在第一行。

答案 1 :(得分:0)

一个非常快速简单的解决方案是使用StringBuilder类型而不是String类型用于变量行和fullStr。 (见https://msdn.microsoft.com/en-us/library/ms172824.aspx)。 字符串是不可变的,这意味着每次为line或fullStr变量赋值时,您实际上并没有更新内存中变量的值,而是废弃先前分配的内存并为变量分配新的内存空间并将新值分配给新的内存空间。这是一个很大的开销,会影响应用程序的性能。

答案 2 :(得分:0)

我知道这不是最佳分辨率,但可能会更快一点。我总是把每一行放在一个列表中。这有助于使字符串不那么长,然后我可以逐行遍历。但是当你逐行阅读时,任何更大的文件都需要时间,因为它正在读取文件的每一行/字节。

Private Function ReadInFile(ByVal strFile As String) As List(Of String)
    Dim strLineTemp As String = ""
    Using read As New StreamReader(strFile)
        While read.Peek <> -1
            strLineTemp = read.ReadLine()
            If strLineTemp.Trim <> "" Then
                lstFileData.Add(strLineTemp)
            End If
        End While
    End Using
    Return lstFileData
End Function

答案 3 :(得分:0)

这是你想要的吗?我交换条件使用正则表达式并删除内部循环。虽然我会将字符串连接换成&#39; StringBuilder&#39;但我在一个大文件上内存不足。

Dim regex As Regex = New Regex("aaa.{25} .*")
    st.Start()
    Using reader As StreamReader = New StreamReader(file)
        Dim line As String = reader.ReadLine
        Do While (Not line Is Nothing)
            If regex.Match(line).Success = False Then

                fullStr1 = fullStr1 & line & vbCrLf
                line = reader.ReadLine
            Else
                fullStr2 = fullStr2 & line & vbCrLf
                line = reader.ReadLine

            End If

        Loop

    End Using