C # Разбор файлов, в которых отсутствует символ новой строки в конце файла - PullRequest
0 голосов
/ 12 февраля 2019

Вопрос: Каков наилучший способ анализа файлов, в которых отсутствует символ новой строки в конце файла?Должен ли я просто попробовать и поймать исключение OutOfMemoryException?Или есть лучший способ?

Справочная информация: Я анализирую файлы журналов с помощью метода ReadRelay () StreamReader для чтения в следующей строке.Итак, базовая структура цикла выглядит следующим образом:

while ((line = sr.ReadLine()) != null)
{
      // Parse the file
}

Это хорошо работает даже для больших файлов (т. Е.> 2 ГБ).Но когда следующая строка не равна нулю и не содержит символа новой строки, StreamReader просто считывает пробелы, пока не будет израсходована вся память, и не будет выдано исключение OutOfMemoryException.Это лучший способ обработать пропущенный символ новой строки в конце файла?Или есть более эффективные способы решения этой проблемы?

Примечание. Файл создается с сервера IIS Exchange.Если не связываться с нашей ИТ-группой, файл кажется обрезанным в середине создания, в результате чего последняя строка является плохой, поскольку в ней отсутствуют данные.

Исследование: Я обнаружил публикацию вSO (см. Ниже), который относится к использованию File.ReadFile.Хотя он работает с файлом намного меньшего размера (т. Е. <2 ГБ), в котором отсутствует символ новой строки, он по-прежнему не работает с большими файлами (т. Е.> 2 ГБ).

https://stackoverflow.com/a/13416225

https://docs.microsoft.com/en-us/dotnet/api/system.io.file.readlines?redirectedfrom=MSDN&view=netframework-4.7.2#System_IO_File_ReadLines_System_String_

Редактировать

Компилятор останавливается на строке While в примере кода ниже.Проблема не в коде, а в файле.Я не могу опубликовать наши файлы журнала.Но, чтобы продемонстрировать, создайте несколько строк данных в NotePad ++.Для последней строки файла удалите символ NewLine, а затем запустите файл.StreamReader взорвется в последней строке, потому что не может найти конец строки.

Ниже приведена копия файла журнала со всем удаленным содержимым данных, за исключением отметки времени и символа NewLine в конце.каждого ряда.Для последней строки я включил последний элемент данных (номер порта) до того, как данные обрезаются.Обратите внимание, что в последней строке отсутствует символ новой строки?

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Я подтвердил, что файл был плохим в нашей ИТ-группе.Случилось так, что первоначальный процесс передачи по сети в мой локальный регион, похоже, испытал сбой.Я повторно передал файл, и он успешно проанализирован.Есть также больше строк.От этого меня оттолкнуло то, что размеры файлов между сетью и моей локальной сетью были идентичны - поэтому я не рассматривал повторную передачу файла во время моих исследований.

Процесс передачи файла, кажется, сначала выделяет полный файл как пустой, а затем начинает заполнять его данными.Удачи в диагностике очень больших файлов, которые нельзя открыть стандартными текстовыми редакторами (например, Notepad, Notepadd ++, Excel и т. Д.), Чтобы увидеть это.Мне пришлось использовать Ultra Edit, и проблема стала очевидной.

Согласно комментарию Ханса Пассанта по связанному вопросу (см. Ссылку ниже), метод ReadRelay () StreamReader будет обрабатывать большие файлы так же хорошо, как и файловую систему.внутреннее кэшированиеИтак, исключения OutOfMemoryException не должны быть проблемой.Я предполагаю, что это было нацелено на компьютеры с недостаточным объемом памяти, а не на плохие файлы.

Спасибо всем за устранение неполадок и мои извинения за прерывание.

Невозможно прочитать большой файл журналас MemoryMappedViewStream

0 голосов
/ 12 февраля 2019

Это должно работать: следует проверить EndOfStream перед попыткой прочитать следующую строку.Также добавлена ​​проверка на нулевое значение.

while (!sr.EndOfStream)
{
  line = sr.ReadLine()?.Trim() ?? "";
  // Parse the line
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...