只更改文本文件中的一行?

时间:2012-04-11 05:47:05

标签: vb.net file-io

我有一个格式为

的文本文件
(title,price,id#)

CD1,11.00,111111
CD2,12.00,222222
CD3,13.00,333333
CD4,14.00,444444
CD5,15.00,555555
CD6,16.00,666666

如果我给了id#和新价格,那么改变相应CD价格的最佳方法是什么?

我确信它有一些关于获取线和拆分它的方法,但我不确定如何编辑一行而不是弄乱整个文件。

3 个答案:

答案 0 :(得分:2)

好的,现在我们知道它是一个短文件,生活变得更容易:

  • 使用File.ReadAllLines
  • 将文件加载到一个行数组中
  • 使用string.Split找到合适的行,将每一行拆分为组成部分,然后检查ID。
  • 当您找到合适的线路时,请将其替换为完整的新线路
  • 使用File.WriteAllLines
  • 写回文件

这应该足以让你前进。

答案 1 :(得分:2)

如果不重写整个文件,则无法重写行(除非行的长度恰好相同)。对于这样一个小文件,最简单的方法是更改​​内存中的行,然后将所有内容重写到文件中:

Dim idToFind = "444444"
Dim newPrice = "100"
Dim lines = IO.File.ReadAllLines(path)
For i = 0 To lines.Length - 1
    Dim line = lines(i)
    Dim fields = line.Split(","c)
    If fields.Length > 2 Then
        Dim id = fields(2)
        If id = idToFind Then
            Dim title = fields(0)
            lines(i) = String.Format("{0},{1},{2}", title, newPrice, id)
            Exit For
        End If
    End If
Next
IO.File.WriteAllLInes(path, lines)

答案 2 :(得分:0)

如果它只是一个包含25行的文件,你可以做一个简单的输入转换输出例程并更新每行的价格。

像这样(使用Streamreader / writer)。

Sub UpdatePrice(ByVal pricesToUpdate As Dictionary(Of Integer, String), ByVal inputPath As String)
    If Not IO.File.Exists(inputPath) Then Return
    Try
        Using inputStream = New IO.StreamReader(inputPath, System.Text.Encoding.UTF8, True)
            Using outputStream = New IO.StreamWriter(inputPath + ".tmp", False, System.Text.Encoding.UTF8)
                While Not inputStream.EndOfStream
                    Dim inputLine = inputStream.ReadLine
                    Dim content = inputLine.Split(","c)
                    If Not content.Length >= 3 Then
                        outputStream.WriteLine(inputLine)
                        Continue While
                    End If
                    Dim id As Integer
                    If Not Integer.TryParse(content(2), id) Then
                        outputStream.WriteLine(inputLine)
                        Continue While
                    End If
                    If Not pricesToUpdate.ContainsKey(id) Then
                        outputStream.WriteLine(inputLine)
                        Continue While
                    End If
                    content(1) = pricesToUpdate(id)
                    outputStream.WriteLine(String.Join(",", {content(0), content(1), content(2)}))
                End While
            End Using
        End Using
        If IO.File.Exists(inputPath + ".tmp") Then
            IO.File.Delete(inputPath)
            IO.File.Move(inputPath + ".tmp", inputPath)
        End If
    Catch ex As IO.IOException
        If IO.File.Exists(inputPath + ".tmp") Then IO.File.Delete(inputPath + ".tmp")
    End Try
End Sub