如何将本地133GB带表头CSV拆分为5份且每份包含表头?
拆分带表头的大CSV文件(Git Bash环境)
为什么split -b不好用?
split -b是按字节硬拆分,会直接截断CSV行,导致拆分后的文件出现不完整的结构化数据,而且它不会自动把表头复制到每个拆分文件里,完全不适合处理带表头的CSV。
方法1:手动循环拆分(精准控制每个文件行数)
- 先把表头单独提取出来:
head -n 1 largefile.csv > header.csv
- 计算需要拆分的数据行数:
先查总总行数:
wc -l largefile.csv
假设总行数是N,那么实际数据行数是N-1,把这个数除以5,就是每个文件要放的基础数据行数(有余数的话最后一个文件多塞几行)。
3. 循环生成带表头的拆分文件:
# 定义变量计算行数 total_data_lines=$(( $(wc -l < largefile.csv) - 1 )) lines_per_file=$(( total_data_lines / 5 )) remaining_lines=$(( total_data_lines % 5 )) # 生成前4个拆分文件 for i in {1..4}; do start_line=$(( (i-1)*lines_per_file + 2 )) # +2是跳过表头,从第2行开始取数据 end_line=$(( i*lines_per_file + 1 )) cat header.csv > split_$i.csv sed -n "${start_line},${end_line}p" largefile.csv >> split_$i.csv done # 生成第5个文件,包含剩余的所有数据行 start_line=$(( 4*lines_per_file + 2 )) cat header.csv > split_5.csv sed -n "${start_line},$p" largefile.csv >> split_5.csv
方法2:用csplit一键拆分(更简洁)
Git Bash自带csplit工具,可以按行数拆分数据,再给每个文件补表头:
# 提取表头和纯数据 head -n 1 largefile.csv > header.csv tail -n +2 largefile.csv > data_only.csv # 把纯数据拆成5份,生成split_data_00到split_data_04的临时文件 csplit data_only.csv -n 2 -k -f split_data_ "/$(( $(wc -l < data_only.csv)/5 ))/" {4} # 给每个临时数据文件加上表头,生成最终拆分文件 for file in split_data_*; do cat header.csv "$file" > "split_${file#split_data_}.csv" rm "$file" done # 清理临时文件 rm header.csv data_only.csv
内容的提问来源于stack exchange,提问作者Radha
相关产品推荐
相关产品推荐

