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

StackOverflow https://stackoverflow.com/questions/1142043

  •  16-09-2019
  •  | 
  •  

Вопрос

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

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

редактировать:Я пытался использовать 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.ReadAllLines(fileName) неправильно загружает файлы с концом строки LF?Используйте это, если вам нужен весь файл - я видел сайт, указывающий, что он медленнее, чем другой метод, но это не так, если вы передадите ему правильную кодировку (по умолчанию UTF-8), плюс он настолько чист, насколько вы можете получить.

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

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

Другие советы

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

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

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

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

Если вы хотите легко перебирать строки (и потенциально использовать LINQ для файла журнала), вы можете найти мой LineReader класс в РазноеUtil полезный.По сути, он оборачивает вызовы 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)
{
    // ...
}

Все в прямом эфире :)

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top