我有一个CSV文件,但与related问题不同,它的某些列包含带双引号的逗号分隔的字符串,例如
foo,bar,baz,quux
11,"first line, second column",13.0,6
210,"second column of second line",23.1,5
(当然,它更长,并且引号的逗号不一定是1或0,也不是可预测的文本。)文本在双引号中也可能有(转义)双引号,或者没有双引号。对于通常引用的字段,完全使用双引号。我们唯一可以做的假设是没有引号的换行符,因此我们可以使用\n
来简单地分割行。
现在,我想提取一个特定的列(例如,第三列)-例如,要打印在标准输出上,每行一个值。我不能简单地使用逗号作为字段定界符(因此,例如,使用cut
);相反,我需要更复杂的东西。那会是什么?
注意:我在Linux系统上使用bash。
答案 0 :(得分:0)
这是一个快速而肮脏的Python csvcut
。 Python csv
library已经了解各种CSV方言等所有知识,因此您只需要一个薄包装即可。
第一个参数应表示要提取的字段的索引,例如
csvcut 3 sample.csv
从CSV文件sample.csv
中提取第三列(可能是带引号的内容)。
#!/usr/bin/env python3
import csv
import sys
writer=csv.writer(sys.stdout)
# Python indexing is zero-based
col = 1+int(sys.argv[1])
for input in sys.argv[2:]:
with open(input) as handle:
for row in csv.reader(handle):
writer.writerow(row[col])
要做的事:错误处理,提取多列。 (本质上并不难;使用row[2:5]
提取第3、4和5列;但是我懒得编写适当的命令行参数解析器。)