在Mac中拆分CSV

zlhcx6iw  于 2023-09-27  发布在  Mac
关注(0)|答案(3)|浏览(216)

有没有办法将一个50 GB的CSV文件分割成多个CSV文件,每个文件包含1GB的数据,并确保其gzip?
我试着做

cat test.csv  | split -b 1000000000g -d -a4 - output_prefix --filter='gzip > $FILE.gz'
usage: split [-l line_count] [-a suffix_length] [file [prefix]]
           split -b byte_count[K|k|M|m|G|g] [-a suffix_length] [file [prefix]]
           split -n chunk_count [-a suffix_length] [file [prefix]]
           split -p pattern [-a suffix_length] [file [prefix]]

但它给出了一个错误。

7vhp5slm

7vhp5slm1#

我认为你不能完全按大小分割,同时在最后一条记录中有一个有效的CSV,所有的单元格都填好了。
如果可能的话,你可以改变你的方法,你可以用Miller和split verb来按记录数分解它:

mlr --csv --from input.csv split -n 1000000

在输出中,您会得到split_1.csv、split_2.csv、...,每个都由1000000条记录组成。
每个都是有效的CSV。

hfwmuf9z

hfwmuf9z2#

我没有完整的答案。但这是给予你原则。
我习惯于收集(与您相反)csv,或者在grep的帮助下从一个csv中提取样本,以创建另一个csv。
所有这些任务以及您的任务的原则是首先在两个单独的临时文件中进行提取:

  • 一个临时的$header_file,只有你的csv文件头
  • 一个临时的$row_file,包含csv的所有行,而不是标题

我这样做,用**$1**你想要处理的csv文件:

header_file=$(mktemp)
rows_file=$(mktemp)

awk 'FNR>1' "$1" > "$rows_file"
awk 'FNR<2' "$1" > "$header_file"

然后,将$rows_file拆分为另一个临时文件中的部分,
让我们分别调用它们:$part_file
然后将它们连接到有效的部分csv文件中,并使用:

cat "$header_file" "$part_file" >"$part_file.csv"

包含已分隔行的每个部分。

0vvn1miw

0vvn1miw3#

不确定这是否有帮助。但我最终还是这么做了。现在我只需要弄清楚如何保存为csv.gv文件

split  -b 1000000000 -a4 test.csv tmp/

相关问题