def csv_split() :
raw = [
'"1,2,3" , "4,5,6" , "456,789"',
'"text":"a,b,c,d", "gate":"456,789"'
]
cr = csv.reader( raw, skipinitialspace=True )
for l in cr :
print len( l ), l
此功能输出以下内容:
3 ['1,2,3 ', '4,5,6 ', '456,789']
6 ['text:"a', 'b', 'c', 'd"', 'gate:"456', '789"']
如您所知,第一行正确地分为3个条目。 但第二行不是。我希望csv阅读器可以拆分它 分成两个,而不是我们在这里有6个。我也考虑过正则表达式 方法,但它假设一些特定的引用方言。
基本上我想要的是: 只要存在一对未引用的“,”就会拆分字符串 “”。
有没有快速和一般的方法来做到这一点?我见过一些正则表达式黑客攻击 假设每个字段总是被引用等等。我想我可以写一个小循环 这样做效率非常低,但肯定会更多 专业的建议。非常感谢!
答案 0 :(得分:2)
CSV不是标准格式,但如果它们出现在文本内部(例如""
),则使用两个"text"":""a,b,c,d"
来转义引号是很常见的。 Python的CSV阅读器在这里正在做正确的事情,因为它假定了这个惯例。我不太确定您对输出的期望是什么,但这是我尝试使用非常简单的CSV阅读器,它可能适合您的格式。随意调整它。
raw = [
'"1,2,3" , "4,5,6" , "456,789"',
'"text":"a,b,c,d", "gate":"456,789"',
'1,2, 3,'
]
for line in raw:
i, quoted, row = 0, False, []
for j, c in enumerate(line):
if c == ',' and not quoted:
row.append(line[i:j].strip())
i = j + 1
elif c == '"':
quoted = not quoted
row.append(line[i:j+1].strip())
for i in range(len(row)):
if len(row[i]) >= 2 and row[i][0] == '"' and row[i][-1] == '"':
row[i] = row[i][1:-1] # remove quotation marks
print row
输出:
['1,2,3', '4,5,6', '456,789']
['text":"a,b,c,d', 'gate":"456,789']
['1', '2', '3', '']
答案 1 :(得分:0)
留下这个给后人,因为我也有点挣扎。
quotechar
的{{1}}参数有助于解决此问题;如果它们在引号内(假设条目中的所有逗号都被引用),它将让你忽略delims(即在这种情况下的逗号)。也就是说,它会起作用:
csv.reader()
...逗号嵌套在引号内,但非逗号字符串没有。
从Py2 docs翻录的演示代码,并进行了修改,以便Name, Message
Ford Prefect, Imagine this fork as the temporal universe.
Arthur Dent, "Hey, I was using that!"
是逗号(duh),而delimiter
是您的双引号quotechar
:
"