Vb.net 有时,在大型文本文件中组合两行
我需要在一个大的ascii文本文件的两行中进行搜索和替换,在随机的地方可能会发生n次(n>1000)。文本文件如下所示:Vb.net 有时,在大型文本文件中组合两行,vb.net,text,replace,large-files,Vb.net,Text,Replace,Large Files,我需要在一个大的ascii文本文件的两行中进行搜索和替换,在随机的地方可能会发生n次(n>1000)。文本文件如下所示: .... StringVariable=' my contents' ..... 我希望它是这样的: .... StringVariable='my contents' .... 对于小文件,我使用AllText,这对小文件很有效: My.Computer.FileSystem.WriteAllText(MyInputFile, My.Computer.FileSys
....
StringVariable='
my contents'
.....
我希望它是这样的:
....
StringVariable='my contents'
....
对于小文件,我使用AllText,这对小文件很有效:
My.Computer.FileSystem.WriteAllText(MyInputFile, My.Computer.FileSystem.ReadAllText(MyOutputFile).Replace("='" & vbCrLf, "='"), False)
对于大型的,AllText会崩溃并出现内存不足错误。我看到了使用ReadLine和WriteLine的帖子,以及如何测试字符串中的字符,但我不知道如何在不丢失文件位置的情况下将多行“n”次组合在一起。我想我可以仔细地将大文件拆分成许多小文件,以允许使用AllText,然后重新组合,但这似乎很粗糙。有更好的办法吗
我知道如何修复上面列出的情况,但我还有其他情况(例如,特定字符串后有2个CR),并且很难解决灵活的情况,即您希望用可变长度的多行字符串替换多行字符串
以下是我用于上述初始案例的代码:
Private Sub RemoveCRBefore(ByVal Infile As String, ByVal Outfile As String, ByVal LookedFor As String)
Dim Line0 As String = ""
Dim LinedUp As String = ""
Dim LookLong As Integer = LookedFor.Length
Dim FirstLine As Boolean = True
Using sr As StreamReader = New StreamReader(Infile)
Using sw = System.IO.File.CreateText(Outfile)
Dim Line1 As String = sr.ReadLine
Do While (Not Line1 Is Nothing)
If Line1.Length >= LookLong Then
If LookedFor = Line1.Substring(0, LookLong) And Not FirstLine Then
LinedUp = Line0.Replace(vbCrLf, "") & Line1
Line0 = LinedUp
FirstLine = True
Else
If FirstLine = False Then sw.WriteLine(Line0)
Line0 = Line1
End If
Else
sw.WriteLine(Line0)
Line0 = Line1
End If
Line1 = sr.ReadLine
FirstLine = False
Loop
sw.WriteLine(Line0)
End Using
End Using
End Sub
或许可以尝试使用streamreader阅读每一行。对其应用Replace方法(因为您正在查找=,这不会影响已完成字符串末尾的换行符)。使用StreamWriter将当前的“固定”行写回辅助文件,并设置Append=true。字符串是不可变的,因此尝试在一行中执行所有这些操作将生成大量字符串,因为新字符串是从
Replace
@CharlesMay创建的-我在初始示例中看到了如何使用line命令(在特定字符串之前删除一个vbCrLf)。不容易扩展到超过2行或类似的示例。我将编辑我的帖子以显示我的初始案例代码。仅供参考-我放弃并编写了4个子例程-一个在字符串后删除vbCrLf,一个在字符串前删除vbCrLf,一个在字符串中间插入缺少的vbCrLf,还有一个用1个vbCrLf替换2个vbCrLf在一个字符串之后。不太流畅,但我不知道如何成为泛型,所以使用的基本思想是先读几行,然后再决定如何编写它们。我不相信这样的特定代码有多大价值,但如果我应该发布它,请让我知道。