2012-04-11 2 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

Будет ли линия замены иметь тот же размер, что и существующая линия? –

+0

@JonSkeet Да, это будет –

+0

Я бы просто прочитал его по строкам, обновил строку, если нужно, и запишет ее снова за строкой. В то время как IO может быть уменьшен, если это не * большой * файл, я бы не пытался быть слишком умным с поиском и случайным доступом и т. Д. Итак, имея в виду: * что было пробовано *? (И, как говорится, посмотрите «CSV».) –

ответ

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

Удивительный! Спасибо чувак! –

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 
Смежные вопросы