Разбор лог файлов и запись в csv (разное количество полей) - PullRequest
0 голосов
/ 08 декабря 2018

Это вопрос, который волнует меня давно.У меня есть файлы журналов, которые я хочу преобразовать в CSV.Моя проблема в том, что пустые поля были пропущены в файлах журнала.Я хочу получить файл csv, содержащий все поля.

Теперь я анализирую файлы журналов и записываю их в xml, потому что одна из приятных особенностей Microsoft Excel заключается в том, что при открытии файла xml с помощьюПри разном количестве элементов в Excel все элементы отображаются в виде отдельных столбцов.

На прошлой неделе мне пришла в голову мысль, что это возможно с помощью Pandas, но я не могу найти хороший пример, чтобы это сделать.

Кто-нибудь, кто знает, как мне это сделать?

Обновлено
Я не могу поделиться реальными журналами здесь.Ниже вымышленный образец:

Образец 1:

First : John Last : Doe Address : Main Street Email : j_doe@notvalid.gov Sex : male State : TX City : San Antonio Country : US Phone : 210-354-4030
First : Carolyn Last : Wysong Address : 1496  Hewes Avenue Sex : female State : TX City : KEMPNER Country : US Phone : 832-600-8133 Bank_Account : 0123456789

регулярное выражение:

matches = re.findall(r'(\w+) : (.*?) ', line, re.IGNORECASE)

Образец 2:

:1: John  :2: Doe :3: Main Street :4: j_doe@notvalid.gov :5: male :6: TX :7: San Antonio :8: US :9: 210-354-4030
:1: Carolyn :2: Wysong :3: 1496  Hewes Avenue :5: female :6: TX :7: KEMPNER :8: US :9: 832-600-8133 :10: 0123456789

регулярное выражение:

matches = re.findall(r':(\d+): (.*?) ', line, re.IGNORECASE)

1 Ответ

0 голосов
/ 08 декабря 2018

Позвольте мне сосредоточиться на вашем первом примере.Ваше регулярное выражение соответствует только первому слову в каждом поле, но давайте пока оставим его таким, поскольку я уверен, что вы легко можете это исправить.

Вы можете создать панд DataFrame для хранения проанализированных данных,затем для каждой строки, в которой вы запускаете свое регулярное выражение, конвертируйте его в словарь и загружайте в панды Series.Затем вы добавляете его в свой фрейм данных.Pandas достаточно умен, чтобы заполнить недостающие данные NaN.

df = pd.DataFrame() 
for l in lines: 
    matches = re.findall(r'(\w+) : (.*?) ', l, re.IGNORECASE) 
    s = pd.Series(dict(matches)) 
    df = df.append(s, ignore_index=True)

>>> print(df)
  Address     City Country               Email    First    Last     Sex State         Phone
0    Main      San      US  j_doe@notvalid.gov     John     Doe    male    TX           NaN
1    1496  KEMPNER      US                 NaN  Carolyn  Wysong  female    TX  832-600-8133

Я не уверен, что необходим шаг dict, возможно, есть способ pandas для прямого анализа вашего списка кортежей.

Затем вы можете легко преобразовать его в csv, при необходимости вы сохраните все свои столбцы с пустыми полями.

df.to_csv("result.csv", index=False) 

>>> !cat result.csv                                                                                                                                                              
Address,City,Country,Email,First,Last,Sex,State,Phone
Main,San,US,j_doe@notvalid.gov,John,Doe,male,TX,
1496,KEMPNER,US,,Carolyn,Wysong,female,TX,832-600-8133

О работе с большими файлами, если вы заранее знаете все имена полей, вы можетеинициализируйте фрейм данных с аргументом columns и запустите синтаксический анализ и csv, сохраняя один чанк за раз.В IIRC есть параметр mode для to_csv, который должен позволить вам добавить к существующему файлу.

...