Вопрос: Каков наилучший способ анализа файлов, в которых отсутствует символ новой строки в конце файла?Должен ли я просто попробовать и поймать исключение 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 в конце.каждого ряда.Для последней строки я включил последний элемент данных (номер порта) до того, как данные обрезаются.Обратите внимание, что в последней строке отсутствует символ новой строки?