如何在Windows或Linux中有条件地拆分大型CSV文件?

oyxsuwqo  于 2023-04-18  发布在  Windows
关注(0)|答案(2)|浏览(212)

我有一个CSV文件,对于Excel来说太大了,我想把它拆分成较小的文件。我已经找到了一种方法来做这个here,它甚至保留了标题行,这是伟大的。
但是,我想在这个过程中添加一些条件。例如,文件中有一个“已确认”列,可能的行值是“0”、“1”或“”(空)。
是否可以在较小的文件中只保留列值为“1”的行?我还有一些其他条件,但我想知道至少从哪里开始。

u59ebvdq

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:

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。

wfypjpf4

wfypjpf42#

您可以使用Miller(在多个操作系统中可用的here)来完成此任务:

mlr --csv filter '$Confirmed == 1' then split -n 999 --prefix 'file' file.csv

相关问题