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