从 CSV 文件中删除列

从 CSV 文件中删除列

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

输入.csv

1,"data",100.00,TRUE
2,"code",91.8,TRUE
3,"analytics",100.00,TRUE

输出.csv

1,"data",100.00
2,"code",91.8
3,"analytics",100.00

答案1

要删除第四列,

$ cut -d, -f4 --complement example.csv > input.csv

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

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

$ perl -MText::CSV -E '$csv = Text::CSV->new({binary=>1});
  while ($row = $csv->getline(STDIN))
  {
    print "$row->[0],$row->[1],$row->[2]\n"
  }' < 示例.csv > 输入.csv

答案2

我建议使用磨坊主(又名mlr)。 Miller 是一个用 C(无依赖项)编写的小型(< 1 MB)程序,用于以流方式处理各种格式(例如 TSV、CSV、表格 JSON、键值对)的表格数据。它可以从大多数 Linux 发行版的存储库中获得(通常名称为磨坊主)。它的 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

如果您想删除最后一列而不需要对它们进行计数,您可以在处理数据之前反转每个 CSV 行,然后rev再次删除它们,如下所示:

< input.csv rev |
mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 1 |
rev > output.csv

希望有帮助。

答案3

在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

如果您希望输出按顺序包含列 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

Python 数组索引从 0 开始,因此列号也从 0 开始计数,如上所示;这就是为什么第 2、3、1 列分别为 1、2、0。

答案4

CSV 格式有时很棘手:CSV 解析器是最佳选择。

采用简单的方法,删除最后一个字段:

1)用awk删除最后一个字段

awk 'BEGIN{FS=OFS=","}{NF--;print}'

2)正则表达式与perl

perl -pe 's/.*\K,.*//'

相关内容