可以使用字符串拆分功能对一个简单的CSV行进行吐出。但有些行可能有"
,例如
"good,morning", 100, 300, "1998,5,3"
因此直接使用字符串拆分不能解决问题。
我的解决方案是首先使用,
拆分行,然后将字符串与"
组合,然后在字符串的开头或结尾处。
这个问题的最佳做法是什么?
我感兴趣的是,有一个Python或F#代码片段。
编辑:我对实现细节更感兴趣,而不是使用库。
答案 0 :(得分:9)
Python中有一个csv模块,用于处理此问题。
编辑:此任务属于“构建词法分析器”类别。执行此类任务的标准方法是构建状态机(或使用将为您执行此操作的词法分析器库/框架。)
此任务的状态机可能只需要两种状态:
顺便说一句,您的联合解决方案会在"Field1","Field2"
或"Field1"",""Field2"
上中断。
答案 1 :(得分:3)
阅读普通的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:]