C # чтение содержимого файла и поиск строк - PullRequest
1 голос
/ 27 апреля 2009

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

Ответы [ 4 ]

5 голосов
/ 27 апреля 2009

Уже есть пара хороших постов о том, как получить строки файла, поэтому я подумал, что немного добавлю об эффективности. Несколько человек упомянули метод File.ReadAllLines (). Этот метод проблематичен с точки зрения эффективности, поскольку он будет считывать весь файл в память за один раз. Кроме того, он использует массив в качестве хранилища, которое требует непрерывной памяти. Если файл достаточно большой, это вызовет проблемы.

Более эффективный способ чтения файлов - это повторное использование метода StreamReader.ReadLine. Он будет возвращать строки по одной за раз, и вам нужно только сохранить строки, которые вам нужны, в памяти. Это также относительно легко превратить в итератор с задержкой.

public static IEnumerable<string> ReadLinesEnumerable(string path) {
  using ( var reader = new StreamReader(path) ) {
    var line = reader.ReadLine();
    while ( line != null ) {
      yield return line;
      line = reader.ReadLine();
    }
  }
}

С точки зрения LINQ. Вы можете использовать LINQ для одинакового совпадения как с ReadAllLines, так и с методом ReadLinesEnumerable, поскольку оба возвращают перечислимый тип данных. Например

var query = from line in ReadLinesEnumerable(@"c:\some\path\file.txt")
            where Regex.IsMatch(line, @"^(\d)+.*$")
            select line;
1 голос
/ 27 апреля 2009

File.ReadAllLines () даст вам массив, содержащий каждую строку в файле. Это может быть больше работы, если вы можете прекратить чтение на полпути через файл. Если нет, это может сэкономить вам время на IO (меньше индивидуальных вызовов IO, это всего лишь предположение).

Если вы действительно беспокоитесь, используйте профилировщик или напишите тест. В противном случае используйте любой метод, который проще всего прочитать.

0 голосов
/ 27 апреля 2009

Метод ReadToEnd () действительно эффективен с точки зрения LoC (строк кода), но если вы беспокоитесь о производительности, вы можете быть осторожны с ним, поскольку он в основном загружает все содержимое файла в память ( строка). Если размер файла достаточно велик, вы наверняка получите удар по производительности.

0 голосов
/ 27 апреля 2009

Если вам нужно изучить все содержимое файла, то вам нужно будет прочитать каждую строку. ReadLine() такой же хороший метод, как и любой другой.

Вы можете прочитать все содержимое файла одновременно, используя StreamReader.ReadToEnd()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...