Как прочитать каждую строку в файле, который ограничен только LF?

2

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

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

edit: Я пытался использовать 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;
            }
Теги:
file
streamreader

4 ответа

4
Лучший ответ

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

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

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

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

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

От документы:

Линия определяется как последовательность символы, сопровождаемые каретой return (0x000d), подача строки (0x000a), возврат каретки, за которым следует линия feed, Environment.NewLine, или конец маркера потока. Строка, которая возвращенный не содержит завершение возврата каретки и/или line feed. Возвращаемое значение является null reference (Nothing in 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

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

0

Я бы предположил, что \LF (\n) будет в порядке (тогда как \CR (\ r) - может вызвать проблемы).

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню