如何在不加载全文件到内存下按索引范围拆分大CSV文件
解决方案:用Miller按索引范围拆分大CSV文件
核心思路
利用Miller的流式处理能力,按索引的百位区间(2000-2099、2100-2199…)分组拆分,同时为每个输出文件保留原表头,全程无需加载整个文件到内存。
步骤与命令
假设你的CSV第一列名为index(若实际列名不同,替换命令中的$index即可):
- 提取原文件表头
先单独导出表头,后续每个拆分文件都需要:
head -n 1 large_file.csv > header.csv
- 用Miller拆分数据行
跳过原文件表头,按索引区间分组输出到对应文件:
mlr --csv --headerless-csv-input skip 1 then split -f 'floor($index / 100) * 100' --output-file-pattern 'output_%d.csv' large_file.csv
--headerless-csv-input skip 1:跳过原文件的第一行表头,因为我们已单独提取split -f 'floor($index / 100) * 100':通过计算将索引映射到区间起始值(如2005→2000、2199→2100),确保同一索引的行全部进入同一文件--output-file-pattern 'output_%d.csv':指定输出文件名格式,比如2000-2099的行保存为output_2000.csv,2100-2199的保存为output_2100.csv,以此类推
- 为拆分文件添加表头
将之前提取的表头写入每个拆分文件的开头:
for file in output_*.csv; do cat header.csv "$file" > temp.csv && mv temp.csv "$file" done
- 清理临时文件
rm header.csv
为什么选Miller的split而非tee?
split动词专为按条件分组输出到不同文件设计,完全匹配你的需求,且不会向输出文件添加任何额外列tee更多用于将同一输出复制到多个文件,无法实现按索引区间分流的逻辑
内容的提问来源于stack exchange,提问作者David Davíd
相关产品推荐
相关产品推荐

