如何用“?”读取CSV行?

时间:2010-01-26 13:52:03

标签: python csv

可以使用字符串拆分功能对一个简单的CSV行进行吐出。但有些行可能有",例如

"good,morning", 100, 300, "1998,5,3"

因此直接使用字符串拆分不能解决问题。

我的解决方案是首先使用,拆分行,然后将字符串与"组合,然后在字符串的开头或结尾处。

这个问题的最佳做法是什么?

我感兴趣的是,有一个Python或F#代码片段。

编辑:我对实现细节更感兴趣,而不是使用库。

4 个答案:

答案 0 :(得分:9)

Python中有一个csv模块,用于处理此问题。

编辑:此任务属于“构建词法分析器”类别。执行此类任务的标准方法是构建状态机(或使用将为您执行此操作的词法分析器库/框架。)

此任务的状态机可能只需要两种状态:

  • 初始值,它读取除逗号和换行符之外的每个字符作为字段的一部分(例外:前导和尾随空格),逗号作为字段分隔符,换行符作为记录分隔符。当遇到开场报价时,它会进入
  • read-quoted-field state,其中除引号之外的每个字符(包括逗号和换行符)都被视为字段的一部分,引号后面没有引号表示读取引用字段的结尾(返回初始状态) ,报价后跟报价被视为单一报价(转义报价)。

顺便说一句,您的联合解决方案会在"Field1","Field2""Field1"",""Field2"上中断。

答案 1 :(得分:3)

来自python's CSV module

阅读普通的CSV文件:

import csv
reader = csv.reader(open("some.csv", "rb"))
for row in reader:
    print row

使用其他格式读取文件:

import csv
reader = csv.reader(open("passwd", "rb"), delimiter=':', quoting=csv.QUOTE_NONE)
for row in reader:
    print row

有一些nice usage examples in LinuxJournal.com

如果您对详细信息感兴趣,请阅读“split string at commas respecting quotes when string not in csv format”,其中显示与此问题相关的一些不错的正则表达式,或者只是阅读csv模块源代码。

答案 2 :(得分:1)

编程实践的第4章给出了CSV解析器的C和C ++实现。

答案 3 :(得分:1)

通用实现细节将是这样的(未经测试的)

def csvline2fields(line):
    fields = []
    quote = None
    while line.strip():
        line = line.strip()
        if line[0] in ("'", '"'):
            # Find the next quote:
            end = line.find(line[0])
            fields.append(line[1:end])
            # Find the beginning of the next field
            next = line.find(SEPARATOR)
            if next == -1:
                break
            line = line[next+1:]
            continue
        # find the next separator:
        next = line.find(SEPARATOR)
        fields.append(line[0:next])
        line = line[next+1:]