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

功能亮点:

  1. 参数化输入​:
    # 指定输入文件
    ./split_csv.sh -i mydata.csv
    
    # 自定义输出前缀
    ./split_csv.sh -i data.csv -o 2024_report_
    
    # 设置旧版Excel限制(65536行)
    ./split_csv.sh -e 65536
  2. 智能错误处理​:
  • 自动检测输入文件是否存在
  • 校验数值参数有效性
  • 友好的错误提示(包含中文说明)
  1. 增强功能​:
    # 自动跳过空分块(当输入文件很小无需拆分时)
    # 显示最终文件大小统计
    # 支持文件名中的空格(通过引号传递参数)
  2. ​执行示例​:
    # 处理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
    # ...

使用建议

  1. 处理特殊字符​:
    # 当路径包含空格时使用引号
    ./split_csv.sh -i "my data.csv" -o "output/report_"
  2. 性能优化​:
    # 对于超大型文件,可通过LC_ALL=C加速处理
    LC_ALL=C ./split_csv.sh -i huge_file.csv
  3. 与find结合使用​:
    # 批量处理目录下所有CSV文件
    find ./data -name "*.csv" -exec ./split_csv.sh -i {} -o split_{} \;

csv超大文件拆分sh脚本
https://www.gmtgo.com/41494.html
作者
大帅
发布于
2025年5月5日
许可协议