Регулярное выражение для извлечения данных CSV, некоторые поля заключены в кавычки и содержат запятые

#python #regex #csv #splunk

#python #регулярное выражение #csv #splunk

Вопрос:

У меня есть следующие типы входных данных (для Splunk)

 svr28pr,Linux File System-ALL,success,32.87,2638.259,26/06/14 19:00,26/06/14 21:03,avamar xxxxx1.network.local,Activity completed with exceptions.,26/06/14 19:00
SVr44PR:Staging_SyncDB,incr,success,1271,1271,27/06/14 11:28,27/06/14 11:28,SQL,,,1/01/70 09:59
 

Мне нужно разбить это на поля — следующее выражение сработало хорошо.

 (?<client>[^,] ),(?<backuptype>[^,] ),(?<status>[^,] ),(?<size>[^,] ),(?<dump>[^,] ),(?<start>[^,] ),(?<complete>[^,] ),(?<application>[^,] ),(?<server>[^,] ),(?<comment>[^,] )
 

Однако из-за изменения имен резервных типов второе поле может быть заключено в кавычки и содержать запятые, например

 svr08ts,"Windows VSS-ALL,ALL",success,0.067,39.627,26/06/14 21:32,26/06/14 21:38,avamar,xxxxxxx2.network.local,Activity completed with exceptions.,26/06/14 20:00
 

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

Комментарии:

1. docs.python.org/3.3/library/csv.html

2. Какое это имеет отношение к python?

Ответ №1:

Вы можете использовать multikv in splunk для обработки табличных данных.

Ответ №2:

Как сказал @thimoty-shields, используйте модуль csv

 import csv
csvfile='backups.csv'
with open(csvfile) as csvfile:
    backups = csv.reader(csvfile)
    for row in backups:
        for cell in row:
            #do what you need
            print cell
 

Ответ №3:

Вам не нужно использовать регулярные выражения для обработки ваших файлов CSV, вместо этого используйте модуль csv. По умолчанию это будет обрабатывать поля, заключенные в кавычки. Вы можете использовать csv.DictReader для создания последовательности словарей, аналогичной той, которая возвращается groupdict() в вашем объекте re match.

Если ваш входной файл содержит:

 svr28pr,Linux File System-ALL,success,32.87,2638.259,26/06/14 19:00,26/06/14 21:03,avamar,xxxxx1.network.local,Activity completed with exceptions.,26/06/14 19:00
SVr44PR:Staging_SyncDB,incr,success,1271,1271,27/06/14 11:28,27/06/14 11:28,SQL,,,1/01/70 09:59
svr08ts,"Windows VSS-ALL,ALL",success,0.067,39.627,26/06/14 21:32,26/06/14 21:38,avamar,xxxxx1.network.local,Activity completed with exceptions.,26/06/14 20:00
 

Этот скрипт

 import csv
from pprint import pprint

fields = 'client backuptype status size dump start complete application server comment'.split()
with open('input.csv') as f:
    reader = csv.DictReader(f)
    reader.fieldnames = fields
    for row_dict in reader:
        pprint(row_dict)    # process the row here
 

выводил бы:

 {None: ['26/06/14 19:00'],
 'application': 'avamar',
 'backuptype': 'Linux File System-ALL',
 'client': 'svssi0000028pr',
 'comment': 'Activity completed with exceptions.',
 'complete': '26/06/14 21:03',
 'dump': '2638.259',
 'server': 'xxxxx1.network.local',
 'size': '32.87',
 'start': '26/06/14 19:00',
 'status': 'success'}
{None: ['1/01/70 09:59'],
 'application': 'SQL',
 'backuptype': 'incr',
 'client': 'SVr44PR:Staging_SyncDB',
 'comment': '',
 'complete': '27/06/14 11:28',
 'dump': '1271',
 'server': '',
 'size': '1271',
 'start': '27/06/14 11:28',
 'status': 'success'}
{None: ['26/06/14 20:00'],
 'application': 'avamar',
 'backuptype': 'Windows VSS-ALL,ALL',
 'client': 'svctx0000008ts',
 'comment': 'Activity completed with exceptions.',
 'complete': '26/06/14 21:38',
 'dump': '39.627',
 'server': 'xxxxxxx2.network.local',
 'size': '0.067',
 'start': '26/06/14 21:32',
 'status': 'success'}
 

и, в частности,

 >>> print row_dict['backuptype']
Windows VSS-ALL,ALL
 

по мере необходимости.