Разбор плохо отформатированного файла журнала, в котором записи представляют собой несколько строк без заданного количества строк

Мне нужно разобрать кучу огромных текстовых файлов, каждый по 100 МБ+. Это плохо отформатированные файлы журналов в формате CSV, но каждая запись состоит из нескольких строк, поэтому я не могу просто прочитать каждую строку и разделить их разделителем. Это также не заданное количество строк, поскольку, если есть пустые значения, иногда строка пропускается или некоторые строки переходят в следующую строку. Также разделитель записи может меняться в пределах одного и того же файла с «» на « ***** », а иногда есть строка с надписью «конец журнала #»

Пример журнала:

"Date:","6/23/2015","","Location:","Kol","","Target Name:","ILO.sed.908"
"ID:","ke.lo.213"
"User:","EDU\namo"
"Done:","Edit File"
"Comment","File saved successfully"
""
"Date:","6/27/2015","","Location:","Los Angeles","","Target Name:","MAL.21.ol.lil"
"ID:","uf.903.124.56"
"Done:","dirt emptied and driven to locations without issue, yet to do anyt"
"hing with the steel pipes, no planks "
"Comment"," l"
""
"end of log 1"
"Date:","5/16/2015","","Location:","Springfield","","Target Name:","ile.s.ol.le"
"ID:","84l.df.345"
"User:","EDU\bob2"
"Done:","emptied successfully"
"Comment","File saved successfully"
" ******* "

Как мне подойти к этому? Он должен быть эффективным, чтобы я мог быстро его обрабатывать, поэтому было бы неплохо уменьшить количество операций ввода-вывода с файлами. В настоящее время я просто читаю это в памяти сразу:

with open('Path/to/file', 'r') as content_file:
    content = content_file.read()

Я также несколько новичок в python, я знаю, как обрабатывать несколько файлов и запускать код для каждого, и у меня есть toString для вывода его в новый файл csv.

Другая проблема заключается в том, что некоторые из файлов журнала имеют размер в несколько ГБ, и было бы нецелесообразно сразу считывать все это в память, но я не знаю, как разделить их на куски. Я не могу просто прочитать X строк, так как количество строк записи не установлено.

Комментарии должны быть сохранены и объединены в одну строку.

Пожалуйста, помогите!


person Yoshi_Magick    schedule 12.07.2015    source источник
comment
Пример чтения огромного файла по частям: stackoverflow.com/questions/519633/   -  person Jay-C    schedule 12.07.2015


Ответы (2)


Я заметил, что каждая запись в журнале начинается со строки «Дата» и заканчивается строкой «Готово», за которой следуют строки «Комментарий». Таким образом, вместо того, чтобы беспокоиться о разделителях, вы можете прочитать все от строки «Дата» до строки «Комментарий» и рассматривать это как один блок журнала.

Сообщение «конец журнала» кажется не очень важным, но если вы действительно хотите захватить и его, вы можете захватить все, что находится между двумя последовательными строками «Дата», и это будет один блок журнала.

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

person Jay-C    schedule 12.07.2015

Чтобы обработать большой файл, вы должны использовать тот факт, что файлы являются итераторами, возвращающими строку за строкой в ​​​​Python:

with open('Path/to/file', 'r') as content_file:
    for line in content_file:
         # your code

Эта функция также используется в библиотеке Python CVS. Либ может быть полезен.

person Klaus D.    schedule 12.07.2015