我有一个包含以下格式数据的文本文件
12345 Abdt3 hy45d et45a 76huj agsj7
现在我想将hy45d替换为在运行时创建的另一个sting。但我没有找到任何办法。它会不断更换第一项或将其附加到下一行。
任何人都可以帮我解决这个问题
我正在使用的代码是
Public Sub SaveToTextFile(ByVal PNR As String, ByVal CaseCount As Integer, ByVal Type As String)
'- Location of the Text files
Dim targetFile As String = "C:\TestReport\TextFiles\PNR.txt"
'- Open the target file/stream
Dim sw As StreamWriter = New StreamWriter(targetFile, True)
' Try
If (CaseCount = 0 And Type = 1) Then
sw.Write(PNR, 0, 6)
ElseIf (CaseCount = 1 And Type = 1) Then
sw.WriteLine(PNR, 6, 7)
ElseIf (CaseCount = 2 And Type = 1) Then
sw.WriteLine(PNR, 13, 7)
ElseIf (CaseCount = 3 And Type = 1) Then
sw.WriteLine(PNR, 20, 7)
ElseIf (CaseCount = 0 And Type = 2) Then
sw.WriteLine(PNR, 27, 7)
ElseIf (CaseCount = 1 And Type = 2) Then
sw.WriteLine(PNR, 34, 7)
ElseIf (CaseCount = 2 And Type = 2) Then
sw.WriteLine(PNR, 41, 7)
ElseIf (CaseCount = 3 And Type = 2) Then
sw.WriteLine(PNR, 48, 7)
ElseIf (CaseCount = 0 And Type = 3) Then
sw.WriteLine(PNR, 55, 7)
ElseIf (CaseCount = 1 And Type = 3) Then
sw.WriteLine(PNR, 62, 7)
ElseIf (CaseCount = 2 And Type = 3) Then
sw.WriteLine(PNR, 69, 7)
ElseIf (CaseCount = 3 And Type = 3) Then
sw.WriteLine(PNR, 76, 7)
End If
'Catch ex As Exception
' Console.Write(ex.ToString())
'End Try
sw.Close()
End Sub
答案 0 :(得分:1)
没有好办法做到这一点。文本文件可以使用为字符分配多个字节的编码。简单地说,即使您知道目标字符串的字符位置,也不会(通常)知道它的字节位置。
因此,.NET类合理地禁止对文本文件进行随机访问。解决这个问题的标准方法是读取文本文件的整个(或至少部分),更改字符串,然后将更改的字符串写回。
所以:
Dim text = My.Computer.FileSystem.ReadAllText("File.txt")
text = text.Replace("hy45d", "myfancynewstring")
My.Computer.FileSystem.WriteAllText("File.txt", text, False)
简短又甜蜜。
或者,如果您想按列搜索:
Dim text = My.Computer.FileSystem.ReadAllText("File.txt")
Dim columns = text.Split(" "c)
'' // Replace third column:
columns(2) = "myfancynewstring"
My.Computer.FileSystem.WriteAllText("File.txt", String.Join(" ", columns) , False)
答案 1 :(得分:1)
答案 2 :(得分:0)
暴力方式是读取整个文件,替换'hy45d'的任何实例,并用新字符串替换文件的(整个)内容。
伪代码:
S = readfile;
S = replace(S, "hy45d", "hello");
writeToFile(S);
(我认为写入文件的唯一方法是追加或替换,但我可能错了)
修改强>
如果你想要单独的列和行,你可以每行使用一个标记器。 (分隔符可能是“”)。 (我确信有一个vb.net的字符串库可以标记化或拆分字符串,至少this guy/girl似乎写了一些有用的字符串函数http://www.codeproject.com/KB/vb/stringfunctions.aspx)
如果你想做几次替换,将它读入2D数组可能会有用,替换列/行中的单词将是微不足道的,但如果你有大文件它可能会变成内存耗尽。
答案 3 :(得分:0)
据我所知,在.Net Framework中确实没有“好”的方法。你有两个选择。
1)将整个文件读入内存,进行更新,将文件重新写回磁盘。
2)相当于直接读写物理磁盘位置 - 我不确定你能在框架中做什么。
将文件转换为非顺序(如数据库)的选项吗?