C # строка за строкой проверка файла - PullRequest
0 голосов
/ 08 ноября 2011

Я читаю из файла построчно, и я хочу отредактировать некоторые строки, которые я прочитал .. Строки, которые я хочу отредактировать, должны иметь некоторые другие определенные строки выше или ниже их, но я не знаю, как это выразитьв 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 

Есть идеи?

Ответы [ 3 ]

6 голосов
/ 08 ноября 2011

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

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

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

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

string[] lines = File.ReadAllLines("foo.txt");
for (int i = 1; i < lines.Length - 1; i++)
{
    if (lines[i - 1] == "Clips" && lines[i + 1] == "Sports")
    {
        lines[i] = "Changed";
    }
}
File.WriteAllLines("foo.txt", lines);
2 голосов
/ 08 ноября 2011

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

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

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

1 голос
/ 08 ноября 2011

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

После того, как вы получите нужную строку, запишите ее обратно в файл, который у вас был.

...