Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 有时,在大型文本文件中组合两行_Vb.net_Text_Replace_Large Files - Fatal编程技术网

Vb.net 有时,在大型文本文件中组合两行

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

我需要在一个大的ascii文本文件的两行中进行搜索和替换,在随机的地方可能会发生n次(n>1000)。文本文件如下所示:

....
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在一个字符串之后。不太流畅,但我不知道如何成为泛型,所以使用的基本思想是先读几行,然后再决定如何编写它们。我不相信这样的特定代码有多大价值,但如果我应该发布它,请让我知道。