Как преобразовать «ключ = значение, ключ = значение, ...» в CSV, когда некоторые значения содержат разделитель как часть значения? - PullRequest
1 голос
/ 20 сентября 2019

У меня есть набор данных в формате key1=value1, key2=value2, key3=value3..., где каждая пара ключ-значение отделена от других ", ".

Однако некоторые значения являются длинными строками, которые содержат ", " какчасть значения.

Как правильно просмотреть эти данные и преобразовать их в csv?

Я пытался использовать csv.reader, но он не работает.

 data = row.lstrip('(').rstrip(')\n')                               
 reader = csv.reader(StringIO(data))                                
 for row2 in reader:                                                
     my_dict = {}                                                   
     for d in row2:                                                 
         my_dict[d.split('=')[0].lstrip()] = d.split('=', 1)[1]                                               

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Вы можете использовать re.findall с itertools.groupby:

import re, itertools as it
def get_vals(d):
   r = [(a, list(b)) for a, b in it.groupby(re.findall('\w+\=|[^\s,]+', d), key=lambda x:x[-1] == '=')]
   return {r[i][-1][0][:-1]:', '.join(r[i+1][-1]) for i in range(0, len(r), 2)}

tests = ['key1=value1, key2=value2, key3=value3', 'key1=va, lue1, key2=valu, e2, test, key3=value3']
print(list(map(get_vals, tests)))

Выход:

[{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}, 
{'key1': 'va, lue1', 'key2': 'valu, e2, test', 'key3': 'value3'}]
1 голос
/ 21 сентября 2019

Используя образец @ Ajax1234, re.split() и прогноз:

import re
str="key1=value1, key2=value2, key3=value3, key1=va, lue1, key2=valu, e2, test, key3=value3"
re.split(", (?=[^ ]+=)",str)
['key1=value1', 'key2=value2', 'key3=value3', 'key1=va, lue1', 'key2=valu, e2, test', 'key3=value3']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...