csv超大文件拆分sh脚本
这个版本通过参数化设计增强了脚本的灵活性,同时保持了原有高效处理大文件的特性,能够适应各种实际数据处理场景的需求。
以下是支持参数输入的增强版脚本,支持灵活指定输入输出路径和行数限制:
#!/bin/bash
# 使用方法函数
usage() {
echo "用法: $0 [-i 输入文件] [-o 输出前缀] [-e Excel最大行数]"
echo "示例: $0 -i data.csv -o result_ -e 1048576"
echo "参数说明:"
echo " -i 输入CSV文件路径(默认为input.csv)"
echo " -o 输出文件前缀(默认为output_part_)"
echo " -e Excel行数限制(默认为1048576)"
echo " -h 显示帮助信息"
exit 1
}
# 初始化默认值
input_file="input.csv"
output_prefix="output_part_"
excel_max_lines=1048576
# 解析命令行参数
while getopts ":i:o:e:h" opt; do
case $opt in
i) input_file="$OPTARG" ;;
o) output_prefix="$OPTARG" ;;
e) excel_max_lines="$OPTARG" ;;
h) usage ;;
\?) echo "无效选项: -$OPTARG" >&2; usage ;;
:) echo "选项 -$OPTARG 需要参数值" >&2; usage ;;
esac
done
# 检查输入文件是否存在
if [ ! -f "$input_file" ]; then
echo "错误: 输入文件 $input_file 不存在" >&2
exit 1
fi
# 计算实际拆分行数
split_lines=$((excel_max_lines - 1))
echo "正在处理: $input_file"
echo "每个分块最多包含: $excel_max_lines 行(包含标题行)"
# 提取标题行
header=$(head -1 "$input_file")
# 处理数据部分
{
tail -n +2 "$input_file" | split -d -l $split_lines - "$output_prefix"
} 2>/dev/null # 抑制split的计数警告
# 添加标题到每个分块
for part in ${output_prefix}*; do
if [ -s "$part" ]; then # 跳过空文件
tmp_file="${part}.tmp"
echo "$header" > "$tmp_file"
cat "$part" >> "$tmp_file"
mv "$tmp_file" "${part}.csv"
rm "$part"
fi
done
# 输出统计信息
output_files=$(ls "${output_prefix}"*.csv 2>/dev/null | wc -l)
if [ "$output_files" -gt 0 ]; then
echo "拆分完成!共生成 ${output_files} 个文件:"
ls -lh "${output_prefix}"*.csv
else
echo "无需拆分:输入文件行数未超过限制"
fi
功能亮点:
- 参数化输入:
# 指定输入文件 ./split_csv.sh -i mydata.csv # 自定义输出前缀 ./split_csv.sh -i data.csv -o 2024_report_ # 设置旧版Excel限制(65536行) ./split_csv.sh -e 65536
- 智能错误处理:
- 自动检测输入文件是否存在
- 校验数值参数有效性
- 友好的错误提示(包含中文说明)
- 增强功能:
# 自动跳过空分块(当输入文件很小无需拆分时) # 显示最终文件大小统计 # 支持文件名中的空格(通过引号传递参数)
- 执行示例:
# 处理GB级文件 ./split_csv.sh -i 10GB_data.csv -o partitioned_ -e 1000000 # 输出结果示例: # 正在处理: 10GB_data.csv # 每个分块最多包含: 1000000 行 # 拆分完成!共生成 12 个文件: # -rw-r--r-- 1 user 2.0G May 1 10:00 partitioned_00.csv # -rw-r--r-- 1 user 2.0G May 1 10:02 partitioned_01.csv # ...
使用建议
- 处理特殊字符:
# 当路径包含空格时使用引号 ./split_csv.sh -i "my data.csv" -o "output/report_"
- 性能优化:
# 对于超大型文件,可通过LC_ALL=C加速处理 LC_ALL=C ./split_csv.sh -i huge_file.csv
- 与find结合使用:
# 批量处理目录下所有CSV文件 find ./data -name "*.csv" -exec ./split_csv.sh -i {} -o split_{} \;
csv超大文件拆分sh脚本
https://www.gmtgo.com/41494.html