C # Построчная проверка файла

#c# #file-io #line-by-line

#c# #файловый ввод-вывод #построчно

Вопрос:

Я читаю из файла построчно и хочу отредактировать некоторые прочитанные строки.. Над или под строками, которые я хочу отредактировать, должны быть какие-то другие конкретные строки, но я не знаю, как выразить это на C #. Например:

 http://www.youtube.com
You Tube | Music | something
Sports
Music
Radio
Clips
http://www.youtube.com/EDIT ME   
Sports
Music
Radio
Clips
  

и я хочу отредактировать строку
только если следующая строка

 Sports 
  

и предыдущая строка является

 Clips
  

Итак, единственная строка, которую я хочу отредактировать из приведенного выше примера, это

 http://www.youtube.com/EDIT ME 
  

Есть идеи?

Комментарии:

1. Э, верны ли ваши данные образца? Похоже, вы скопировали первый раздел и не отредактировали ненужные фрагменты.

Ответ №1:

На самом деле вы не можете «редактировать» файл построчно. Было бы лучше использовать один из двух подходов:

  • Прочитайте весь файл в память, например, используя File.ReadAllLines , затем внесите соответствующие изменения в память и перепишите все (например, используя File.WriteAllLines )
  • Одновременно откройте как входной, так и выходной файл. Прочитайте строку за раз, определите, чему она должна соответствовать в выходном файле, затем запишите строку.

Первая версия проще, но, очевидно, требует больше памяти. Это особенно сложно, если вам нужно просмотреть следующую и предыдущую строки, как вы упомянули.

Простой пример первого подхода:

 string[] lines = File.ReadAllLines("foo.txt");
for (int i = 1; i < lines.Length - 1; i  )
{
    if (lines[i - 1] == "Clips" amp;amp; lines[i   1] == "Sports")
    {
        lines[i] = "Changed";
    }
}
File.WriteAllLines("foo.txt", lines);
  

Ответ №2:

Подход #1
Пока вы просматриваете файл, сохраняйте переменную для предыдущей строки (всегда обновляйте ее до текущей строки перед выполнением цикла). Теперь, когда вы знаете текущую строку и предыдущую строку, вы можете решить, нужно ли редактировать текущую строку.

Подход #2
Пока вы просматриваете файл, установите флаг, соответствующий некоторому условию, например, я только что нашел Sports . Если позже вы обнаружите условие, которое должно снять флаг, например, я только что нашел Radio , отмените его установку. Если вы обнаружите, что Clips вы можете проверить, является ли это SportsFlag установленным, чтобы увидеть, нужно ли редактировать эту Clips строку.

Второй подход более гибкий (позволяет устанавливать и отменять несколько флагов в зависимости от текущей строки) и хорош, если между Sports и Clips может быть несколько строк crud. Фактически это конечный автомат для бедных пользователей

Ответ №3:

Если файл не такой большой, я бы прочитал весь файл в виде строки. Затем вы можете свободно манипулировать им, используя такие методы, как indexOf и substring .

Как только у вас будет строка, какая вам нужна, запишите ее обратно поверх файла, который у вас был.