希望自动化处理非常大的.csv文件的过程



这是我的难题。我需要处理来自大型.csv文件的信息。文件的典型大小是大约200mb,这导致大约3-4百万行。文件包含人类可读的信息。5个字段。我的过程最初是获取文件并根据最后一个字段进行排序

"排序-k4-n-t;

然后拆分

"split-l 1000000";

然而,现在我需要添加来自第二字段的base64的解码。

我用这个脚本测试

awk'BEGIN{FS=OFS=","}(cmd="echo"$2"|base64--解码";cmd|getline v;$2=v}1'原始文件名.csv>新文件名.csv

--在示例文件a上运行此命令时,我收到一条错误消息。

"sh:fork:资源暂时不可用">

并且该过程停止。

我的最终输出是几个.csv文件,我用来导入Excel选项卡进行处理。

以下是我的问题:

  1. 为什么我在运行awk时出现错误?有没有一个不同的命令可以做我需要的更快更干净的

  2. 有人能建议一个更好的方法来处理我的文件吗?我试图远离java,但python脚本可能会起作用。

我不是专业的程序员,因此我对工具的了解不是最新的。

如有任何建议/协助,我们将不胜感激。

感谢

如果你能安装一个程序,我推荐GoCSV;它是一个专门为CSV构建的多功能工具,具有许多操作数据的功能,包括解码base64,并且它是为许多平台预先构建的。

我模拟了一个样本CSV:

Col1,Col2,Col3,Col4,Col5
banana,U3RhY2tPdmVyZmxvdw==,apple,0,turnip
banana,U3RhY2tPdmVyZmxvdw==,apple,1,turnip
banana,U3RhY2tPdmVyZmxvdw==,apple,2,turnip
banana,U3RhY2tPdmVyZmxvdw==,apple,3,turnip
banana,U3RhY2tPdmVyZmxvdw==,apple,4,turnip
banana,U3RhY2tPdmVyZmxvdw==,apple,5,turnip
banana,U3RhY2tPdmVyZmxvdw==,apple,6,turnip
banana,U3RhY2tPdmVyZmxvdw==,apple,7,turnip
banana,U3RhY2tPdmVyZmxvdw==,apple,8,turnip
banana,U3RhY2tPdmVyZmxvdw==,apple,9,turnip

我们可以建立一个管道:

  • base64解码第二列(实际上必须添加一整列(
  • 选择新列并将其放回原位(本质上,覆盖原始base64编码的列(
  • 将新列重命名为旧列
  • 在第4列排序
  • 每1_000_000行拆分一次

我将从base64解码开始,因为要做到这一点,我们实际上需要添加一个新列:

gocsv add -name New_col -t '{{ b64dec .Col2 }}' small.csv
Col1,Col2,Col3,Col4,Col5,New_col
banana,U3RhY2tPdmVyZmxvdw==,apple,0,turnip,StackOverflow
banana,U3RhY2tPdmVyZmxvdw==,apple,1,turnip,StackOverflow
...

然后,我们可以使用select命令将原始列有效地替换为新列:

...
| gocsv select -c 1,New_col,3-5
Col1,New_col,Col3,Col4,Col5
banana,StackOverflow,apple,0,turnip
banana,StackOverflow,apple,1,turnip

然后将新列重命名回旧名称:

...
| gocsv rename -c New_col -names Col2
Col1,Col2,Col3,Col4,Col5
banana,StackOverflow,apple,0,turnip
banana,StackOverflow,apple,1,turnip

从那里开始,根据第4列添加排序,并拆分为CSV,每个CSV不大于1_000_000行:

...
| gocsv sort -c 4 -reverse 
| gocsv split -max-rows 1_000_000

(我的排序颠倒了,因为第4列已经按升序排列了。(

以下是整个流程:

gocsv add -name New_col -t '{{ b64dec .Col2 }}' big.csv 
| gocsv select -c 1,New_col,3-5 
| gocsv rename -c New_col -names Col2 
| gocsv sort -c 4 -reverse 
| gocsv split -max-rows 1_000_000

这个10行的小模型来自我制作的你的数据的大模型:

% gocsv dims big.csv 
Dimensions:
Rows: 4000000
Columns: 5

当我在大型CSV:上运行整个管道时

% time ./main.sh
./main.sh  21.10s user 13.55s system 165% cpu 20.951 total
% ls out*.csv
out-1.csv       out-2.csv       out-3.csv       out-4.csv
% gocsv dims out-1.csv 
Dimensions:
Rows: 1000000
Columns: 5
% gocsv head -n 2 out-1.csv
Col1,Col2,Col3,Col4,Col5
banana,StackOverflow,apple,3999999,turnip
banana,StackOverflow,apple,3999998,turnip
% gocsv tail -n 2 out-4.csv
Col1,Col2,Col3,Col4,Col5
banana,StackOverflow,apple,1,turnip
banana,StackOverflow,apple,0,turnip

最新更新