2012-04-11 53 views
1

我有格式的文本文件:只更改文本文件中的一行?

(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 

什麼去改變相應的CD的價格,如果我給出的編號和新的價格最好的方法是什麼?

我確定它對於獲取線條和分割線條有一些幫助,但我不確定如何編輯一條線而不是弄亂整個文件。

+2

替換線的大小是否與現有線相同? – 2012-04-11 05:48:33

+0

@JonSkeet是的,它會 – 2012-04-11 05:55:37

+0

我會逐行閱讀它,更新行,如果需要,並逐行寫出來。雖然IO可以減少,除非它是一個* large *文件,我會避免試圖在尋求和隨機訪問等方面過於聰明。所以,考慮到這一點:*什麼已經嘗試*? (這就是說,查找「CSV」。) – 2012-04-11 05:59:13

回答

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) 
+0

太棒了!謝啦! – 2012-04-12 02:33:58

2

好了,現在我們知道這是一個短文件,生活變得更加容易:

  • 將文件加載到使用File.ReadAllLines
  • 的線陣列查找使用string.Split分割每行到行權組成部分,並檢查身份證。
  • 當你找到了正確的路線,用完整的新線
  • 更換寫有File.WriteAllLines

文件後面這應該足以讓你去。

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