2009-07-17 3 views
2

Мне нужно прочитать по очереди файл журнала. Это около 6 МБ в размере и 40000 строк. Но после тестирования моей программы я обнаружил, что этот файл журнала ограничивается только символом LF. Поэтому я не могу использовать метод ReadlineStreamReader классКак читать каждую строку в файле, который ограничивается только LF?

Как исправить эту проблему?

редактировать: Я пытался использовать Text Reader, но моя программа по-прежнему не работает:

using (TextReader sr = new StreamReader(strPath, Encoding.Unicode)) 
      { 


       sr.ReadLine(); //ignore three first lines of log file 
       sr.ReadLine(); 
       sr.ReadLine(); 

       int count = 0; //number of read line 
       string strLine; 
       while (sr.Peek()!=0) 
       { 
        strLine = sr.ReadLine(); 
        if (strLine.Trim() != "") 
        { 
         InsertData(strLine); 
         count++; 
        } 
       } 

       return count; 
      } 

ответ

4

Does File.ReadAllLines (Filename) не правильно загружать файлы с концами LF линии? Используйте это, если вам нужен весь файл - я видел сайт, указывающий, что он медленнее, чем другой метод, но это не так, если вы передаете ему правильную кодировку (по умолчанию UTF-8), плюс она такая же чистая, как вы можете получить.

Редактировать: Он делает. И если вам нужна потоковая передача, TextReader.ReadLine() корректно обрабатывает концы строк Unix.

Редактировать снова: также StreamReader. Вы только что проверили документацию и предположили, что она не будет обрабатывать концы линии LF? Я смотрю в Reflector, и это похоже на правильную рутину.

+0

Файл большой, на самом деле. и я должен читать строки за строкой для последующей обработки – Vimvq1987

+0

@ Vimvq1987 (4 года спустя ...), но как это решило вашу проблему? IOW, если это правильно, ваш код не срабатывал по другой причине. Из любопытства (и если вы помните), что это было? –

8

TextReader.ReadLine уже обрабатывает линии, завершаемые только \n.

От the docs:

линия определяется как последовательность символов, за которыми следует каретки возврата (0x000d), питающей линии (0x000A), возврат каретки с последующим линейным корма , Environment.NewLine или конец маркера потока. Строка, которая возвращает , не содержит завершающего возврата каретки и/или line feed. Возвращаемое значение является нулевой ссылкой (ничего в Visual Basic), если достигнут конец входного потока .

Итак, в принципе, все должно быть в порядке. (Я говорил о TextReader, а не StreamReader, потому что это, где метод объявлен. - очевидно, он все равно будет работать с StreamReader)

Если вы хотите перебрать линии легко (и, возможно, использовать LINQ против лог-файл) вы можете найти мой класс LineReader в MiscUtil полезным. Он в основном обертывает вызовы на ReadLine() в итераторе. Так, например, вы можете сделать:

var query = from file in Directory.GetFiles("logs") 
      from line in new LineReader(file) 
      where !line.StartsWith("DEBUG") 
      select line; 

foreach (string line in query) 
{ 
    // ... 
} 

Все потоковый :)

+0

моя программа все еще не работает. Я не знаю, что не так :( – Vimvq1987

0

я бы догадался \ LF (\ п) будет в порядке (а \ CR (\ г) -только может вызвать проблемы).

Вы можете читать каждую строку персонажа за раз и обрабатывать его, когда вы читаете терминатор.

После профилирования, если это слишком медленно, вы можете использовать буферизацию со стороны приложения с помощью read ([]). Но сначала попробуйте простой персонаж!

+0

Быстрые функции, которые реализуют эту функциональность. Определенно старайтесь сначала, так как они быстры, короткие, выразительные и стандартизованные. –

0

Или вы можете использовать метод Readblock и самостоятельно разбирать строки

Смежные вопросы