Как прочитать каждую строку в файле, который ограничен только LF? - PullRequest
2 голосов
/ 17 июля 2009

Мне нужно построчно прочитать файл журнала. Это около 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;
            }

Ответы [ 4 ]

9 голосов
/ 17 июля 2009

TextReader.ReadLine уже обрабатывает строки, оканчивающиеся на \n.

С Документы :

Строка определяется как последовательность символы, сопровождаемые кареткой возврат (0x000d), перевод строки (0x000a), возврат каретки с последующей строкой feed, Environment.NewLine или конец маркера потока. Строка, которая возвращенный не содержит прекращение возврата каретки и / или перевод строки. Возвращаемое значение пустая ссылка (ничего в 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)
{
    // ...
}

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

3 голосов
/ 17 июля 2009

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

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

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

0 голосов
/ 17 июля 2009

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

0 голосов
/ 17 июля 2009

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

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

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

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