从 CSV 文件中删除列

pri*_*ka3 10 text-processing csv

我有一个 CSV 文件,我需要从中删除一列。问题是我导出了没有标题的 CSV 文件。那么如何从 CSV 文件中删除该列。例如,如果我有example.csv我想要从中删除最后一列,这是一个布尔数据,并将文件作为input.csv

输入文件

1,"data",100.00,TRUE
2,"code",91.8,TRUE
3,"analytics",100.00,TRUE
Run Code Online (Sandbox Code Playgroud)

输出.csv

1,"data",100.00
2,"code",91.8
3,"analytics",100.00
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 25

要删除第四列,

$ cut -d, -f4 --complement example.csv > input.csv
Run Code Online (Sandbox Code Playgroud)

调整 -f 选项以匹配列号。

如果 CSV 文件更复杂,您可以使用一些 perl 和 Text::CSV 包,

$ perl -MText::CSV -E '$csv = Text::CSV->new({binary=>1}); 
  while ($row = $csv->getline(STDIN)) 
  {
    打印 "$row->[0],$row->[1],$row->[2]\n"
  }' <example.csv> input.csv


小智 6

我建议使用米勒(AKA mlr)。Miller 是一个用 C(无依赖)编写的小型(< 1 MB)程序,用于以流方式处理各种格式(例如,TSV、CSV、表格 JSON、键值对)的表格数据。它可以从大多数 Linux 发行版的存储库中获得(通常以miller的名字命名)。它的 CSV 解析器处理多行单元格(即带有嵌入换行符的单元格)。尽管它假定 CSV 文件带有标题,但它具有处理无标题 CSV 文件的选项 (--implicit-csv-header--headerless-csv-output)。对于您的用例,假设您要删除第四列(列索引从 1 开始),您可以执行以下操作

mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 4 input.csv > output.csv
Run Code Online (Sandbox Code Playgroud)

如果您想删除最后一列而不必计算它们,您可以在处理数据之前反转每个 CSV 行,然后rev再重新读取它们,如下所示:

< input.csv rev |
mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 1 |
rev > output.csv
Run Code Online (Sandbox Code Playgroud)

希望有帮助。


Nom*_*mal 5

在 Python 中使用 csv 模块:

python -c 'import sys,csv
w = csv.writer(sys.stdout)
for row in csv.reader(sys.stdin):
    w.writerow(row[0:-1])' < input.csv > output.csv
Run Code Online (Sandbox Code Playgroud)

如果您希望输出按该顺序包含第 2、3 和 1 列,请使用

python -c 'import sys,csv
w = csv.writer(sys.stdout)
for row in csv.reader(sys.stdin):
    w.writerow([row[1], row[2], row[0]])' < input.csv > output.csv
Run Code Online (Sandbox Code Playgroud)

Python 数组索引从 0 开始,因此列号也从 0 开始计算,如上;这就是为什么它们在第 2、3、1 列中分别为 1、2、0 的原因。