Поскольку каждой отдельной строки недостаточно, данные должны быть собраны.Согласно вашему описанию и образцу, вы можете сделать это по блокам.Просто накапливайте все поля блока - уникальные поля будут содержать только один элемент.
Вы эффективно разбираете блоки с помощью генератора:
def parse_blocks(source: 'Iterable[str]'):
block = {}
for line in source:
if not line: # delimiter between blocks
yield block
block = {}
else:
key, value = line.split()
block.setdefault(key, []).append(value.strip('"'))
if block:
yield block
Это дает вамитерируемый из блоков, такой как
{'description': ['export'], 'source': ['factory1', 'factory2', 'factory3'], 'destination': ['customer1', 'customer2'], 'shipdate': ['asap']}, ...
Для каждого блока вам нужны все комбинации по полям.itertools.product
предоставляет это из коробки.
import itertools
def merge_lines(blocks: 'Dict[str, List[str]]', *fields: 'str'):
for block in blocks:
yield from itertools.product(
*(block[key] for key in fields)
)
Это предоставляет данные отдельных строк в виде повторяющихся наборов:
('export', 'factory1', 'customer1', 'asap'), ('export', 'factory1', 'customer2', 'asap'), ...
Вы можетепередать это непосредственно в csv
или обработать его так, как вы считаете нужным.
import csv
import sys
fields = 'description', 'source', 'destination', 'shipdate'
writer = csv.writer(sys.stdout) # or write to a file, pipe, ...
writer.writerow(fields)
for data in merge_lines(parse_blocks(input_list), *fields): # insert your input here
writer.writerow(data)
Это даст желаемый вывод в формате csv:
description,source,destination,shipdate
export,factory1,customer1,asap
export,factory1,customer2,asap
export,factory2,customer1,asap
export,factory2,customer2,asap
export,factory3,customer1,asap
export,factory3,customer2,asap
export,factory4,customer1,30
export,factory5,customer1,30
export,factory6,customer1,30