Я предполагаю, что лист был преобразован в CSV-файл.Таким образом, вы можете использовать модуль csv, чтобы сначала проанализировать строки, а затем проанализировать поле Fields
.И вы можете напрямую использовать тот же модуль CSV для непосредственного создания файла CSV результата.
Предполагая, что входной файл CSV (обратите внимание на кавычки вокруг многострочного поля):
AuditDate,Fields,ModifiedBy
1/1/2019 7:58,"Status: Assigned (0)
Site Group: XXX
Region: xxx
Site: xxxxx
Summary: xxxx
Location Company: xxx
Support Organization: XXXX
Support Group Name: xxxxx
Last Name: xxxx
First Name: xxxx
Categorization Tier 1:
Categorization Tier 2:
Categorization Tier 3:
Company: xxxx
Priority: xxx
Work Order Type: xxx
Company3: xxxxx
Request Manager:
Product Cat Tier 1(2):
Product Cat Tier 2 (2):
Product Cat Tier 3 (2):
ASORG: IT Shoreside
ASCPY: xxxx
ASGRP: xxx
Request Assignee:
Status History: XXXX",XXXX
1/1/2019 8:31,Request Assignee: XXXX,XXXX
1/1/2019 15:02,Status: Pending (1),XXXX
1/3/2019 13:00,Status: Completed (5),XXXX
1/9/2019 2:46,Status: Closed (8),XXXX
Выможет легко обработать это так:
with open('input.csv', newline='') as fd, open('output.csv', 'w', newline='') as fdout:
rd = csv.DictReader(fd) # directly use a DictReader for reading
# declare a DictWriter for the required fields ignoring any additional field (extrasaction)
wr = csv.DictWriter(fdout, ['AuditDate', 'Status', 'Priority', 'Request Assignee',
'ASGRP', 'ModifiedBy'], extrasaction='ignore')
wr.writeheader() # write the headers
for row in rd:
with io.StringIO(row['Fields']) as ffd: # process Fields
frd = csv.reader(ffd,delimiter=':', skipinitialspace=True)
row.update(dict(frd)) # update the row dictionary with the "sub-fields"
_ = wr.writerow(row) # and directly use that
Вы должны получить, как ожидалось:
AuditDate,Status,Priority,Request Assignee,ASGRP,ModifiedBy
1/1/2019 7:58,Assigned (0),xxx,,xxx,XXXX
1/1/2019 8:31,,,XXXX,,XXXX
1/1/2019 15:02,Pending (1),,,,XXXX
1/3/2019 13:00,Completed (5),,,,XXXX
1/9/2019 2:46,Closed (8),,,,XXXX