【问题标题】:How do I extract column from CSV with quoted commas, using the shell?如何使用 shell 从带引号的逗号的 CSV 中提取列?
【发布时间】:2019-02-27 04:49:16
【问题描述】:

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

【问题讨论】:

  • 您好,“双引号”是什么意思?
  • awk 'BEGIN{FS=OFS=","} NF==5{$2=$2 OFS $3; $3=$4; $4=$5; NF=4} {print $3}' file?
  • @NemanjaRadojković 建议 CSVKit。似乎相当有用,虽然不是一个“外壳解决方案”。太糟糕了,他删除了他的答案。
  • @oguzismail:我的意思是“我的名字是 \"John Smith\",你叫什么?”可以出现在 CSV 文件中。
  • @Cyrus:为什么会这样?

标签: bash csv text-processing quoting


【解决方案1】:

这是一个又快又脏的 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 列;但我懒得写一个合适的命令行参数解析器。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2012-11-17
    • 2016-01-18
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多