#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 .
Как только у вас будет строка, какая вам нужна, запишите ее обратно поверх файла, который у вас был.