0
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 个。我也考虑过正则表达式方法,但它假设了一些特定的引用方言。

基本上我想要的是:只要有一个没有在一对“”中引用的“,”就拆分字符串。

有什么快速通用的方法可以做到这一点吗?我见过一些正则表达式黑客,它们假设每个文件都被引用等。我想我可以写一个小循环,这样做效率很低,但肯定会感谢一些更专业的建议。非常感谢!

4

2 回答 2

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', '']
于 2012-07-09T02:14:35.603 回答
0

把这个留给后代,因为我也为此苦苦挣扎了一段时间。

quotechar论点csv.reader()有助于解决这个问题;如果它们在引号内(假设条目内的所有逗号都已被引用),它将让您忽略分隔符(即在这种情况下为逗号)。也就是说,它将为此工作:

Name, Message
Ford Prefect, Imagine this fork as the temporal universe.
Arthur Dent, "Hey, I was using that!" 

...逗号已嵌套在引号内,但非逗号字符串没有。

演示代码从Py2 docs中提取,并编辑delimiter为逗号 (duh) 并且quotechar是您的双引号"

import csv
with open('eggs.csv', 'rb') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in spamreader:
        print ', '.join(row)
于 2013-11-09T18:13:39.023 回答