如何使用外壳程序从带引号逗号的CSV中提取列?

时间:2018-09-23 13:08:49

标签: bash csv text-processing quoting

我有一个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。

1 个答案:

答案 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列;但是我懒得编写适当的命令行参数解析器。)