我有一个CSV文件,对于Excel来说太大了,我想把它拆分成较小的文件。我已经找到了一种方法来做这个here,它甚至保留了标题行,这是伟大的。但是,我想在这个过程中添加一些条件。例如,文件中有一个“已确认”列,可能的行值是“0”、“1”或“”(空)。是否可以在较小的文件中只保留列值为“1”的行?我还有一些其他条件,但我想知道至少从哪里开始。
u59ebvdq1#
我喜欢命令行实用程序GoCSV, by aotimme,它遵循Unix的理念,拥有许多小工具,每个小工具都能很好地完成一件事,而且这些工具可以被流水线化,它也有pre-built binaries for Linux and Windows。我根据你问题中的信息模拟了这个示例输入:
_ID__,Confirmed 00001,1 00002,0 00003,0 00004,1 00005,1 ... 09996,1 09997,0 09998,0 09999,0 10000,1
GoCSV的filter和split子命令可以通过管道连接在一起,首先过滤掉任何“非1”行;然后将剩余的“1”行分成每个1000行的文件:
gocsv filter -c Confirmed -eq 1 input.csv | gocsv split --max-rows 999
filter子命令指定with column to consider,-c Confirmed Confirmed列,然后-eq 1指定Confirmed列中只有1的行应该输出。GoCSV总是将第一行作为标题(它的许多子命令只有在将第一行解释为标题时才有意义),所以我为--max-rows减去1。对于我的mock input.csv,它产生了5个输出CSV:
-c Confirmed
-eq 1
--max-rows
ls out*.csv | while read CSV; do echo "--$CSV--" gocsv dims $CSV done
--out-1.csv-- Dimensions: Rows: 999 Columns: 2 --out-2.csv-- Dimensions: Rows: 999 Columns: 2 --out-3.csv-- Dimensions: Rows: 999 Columns: 2 --out-4.csv-- Dimensions: Rows: 999 Columns: 2 --out-5.csv-- Dimensions: Rows: 979 Columns: 2
同样,GoCSV不把文件头算作一行,因此完整文件的行数只有999。
wfypjpf42#
您可以使用Miller(在多个操作系统中可用的here)来完成此任务:
mlr --csv filter '$Confirmed == 1' then split -n 999 --prefix 'file' file.csv
2条答案
按热度按时间u59ebvdq1#
我喜欢命令行实用程序GoCSV, by aotimme,它遵循Unix的理念,拥有许多小工具,每个小工具都能很好地完成一件事,而且这些工具可以被流水线化,它也有pre-built binaries for Linux and Windows。
我根据你问题中的信息模拟了这个示例输入:
GoCSV的filter和split子命令可以通过管道连接在一起,首先过滤掉任何“非1”行;然后将剩余的“1”行分成每个1000行的文件:
filter子命令指定with column to consider,
-c Confirmed
Confirmed列,然后-eq 1
指定Confirmed列中只有1的行应该输出。GoCSV总是将第一行作为标题(它的许多子命令只有在将第一行解释为标题时才有意义),所以我为
--max-rows
减去1。对于我的mock input.csv,它产生了5个输出CSV:
同样,GoCSV不把文件头算作一行,因此完整文件的行数只有999。
wfypjpf42#
您可以使用Miller(在多个操作系统中可用的here)来完成此任务: