将数据写入特定位置的文本文件

时间:2009-09-02 11:47:24

标签: vb.net

我有一个包含以下格式数据的文本文件

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

4 个答案:

答案 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)

  1. 通过搜索功能搜索字节位置。
  2. 按filestream.Seek(bytepos,seekorigin.Begin)设置新的游标流位置。
  3. 然后将字符串写入或附加到该pos行。冲洗它。

答案 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)相当于直接读写物理磁盘位置 - 我不确定你能在框架中做什么。

将文件转换为非顺序(如数据库)的选项吗?