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)
希望有帮助。
在 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 的原因。