这是我的难题。我需要处理来自大型.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选项卡进行处理。
以下是我的问题:
-
为什么我在运行awk时出现错误?有没有一个不同的命令可以做我需要的更快更干净的
-
有人能建议一个更好的方法来处理我的文件吗?我试图远离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