我有一个 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,.*//'