如何用脚本批量分割CSV文件?

wen 实用脚本 4

本文目录导读:

如何用脚本批量分割CSV文件?

  1. 方法一:Python脚本(最灵活)
  2. 方法二:Bash脚本(Linux/Mac)
  3. 方法三:Windows PowerShell脚本
  4. 方法四:使用awk(Unix/Linux)
  5. 使用建议
  6. 安装依赖

我会为您介绍几种批量分割CSV文件的脚本方法,以下是最常用且高效的几种实现方式:

Python脚本(最灵活)

import pandas as pd
import os
def split_csv_by_rows(input_file, rows_per_file=1000, output_dir="output"):
    """
    按行数分割CSV文件
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    # 读取大文件时使用chunksize
    chunk_count = 0
    for chunk in pd.read_csv(input_file, chunksize=rows_per_file):
        output_file = f"{output_dir}/part_{chunk_count:04d}.csv"
        chunk.to_csv(output_file, index=False)
        print(f"已创建: {output_file}")
        chunk_count += 1
    print(f"分割完成!共生成 {chunk_count} 个文件")
def split_csv_by_files(input_file, num_files=5, output_dir="output"):
    """
    按文件数量均分CSV文件
    """
    os.makedirs(output_dir, exist_ok=True)
    # 计算总行数(去除表头)
    with open(input_file, 'r') as f:
        total_rows = sum(1 for _ in f) - 1
    rows_per_file = total_rows // num_files + 1
    chunk_count = 0
    for chunk in pd.read_csv(input_file, chunksize=rows_per_file):
        if chunk_count == num_files:
            break
        output_file = f"{output_dir}/part_{chunk_count:04d}.csv"
        chunk.to_csv(output_file, index=False)
        chunk_count += 1
# 使用示例
if __name__ == "__main__":
    # 按每1000行分割
    split_csv_by_rows("large_file.csv", rows_per_file=1000)
    # 或者按文件数量分割
    # split_csv_by_files("large_file.csv", num_files=10)

Bash脚本(Linux/Mac)

#!/bin/bash
# 按行数分割CSV文件
split_csv_by_rows() {
    local input_file="$1"
    local rows_per_file="${2:-1000}"
    local output_prefix="${3:-part_}"
    # 提取表头
    head -1 "$input_file" > header.csv
    # 分割数据(去掉表头)
    tail -n +2 "$input_file" | split -l "$rows_per_file" - "${output_prefix}"
    # 为每个分割文件添加表头
    for file in ${output_prefix}*; do
        if [ "$file" != "${output_prefix}" ] && [ -f "$file" ]; then
            cat header.csv "$file" > temp_$file
            mv temp_$file "$file.csv"
            rm -f "$file"  # 删除无表头的临时文件
        fi
    done
    rm -f header.csv
    echo "分割完成!"
}
# 按文件数量分割
split_csv_by_files() {
    local input_file="$1"
    local num_files="${2:-5}"
    local output_prefix="${3:-part_}"
    total_lines=$(wc -l < "$input_file")
    lines_per_file=$((total_lines / num_files + 1))
    split_csv_by_rows "$input_file" "$lines_per_file" "$output_prefix"
}
# 使用示例
# split_csv_by_rows "data.csv" 1000
# split_csv_by_files "data.csv" 10

Windows PowerShell脚本

# Split-CSV.ps1
param(
    [Parameter(Mandatory=$true)]
    [string]$InputFile,
    [Parameter(Mandatory=$false)]
    [int]$RowsPerFile = 1000,
    [Parameter(Mandatory=$false)]
    [string]$OutputDir = "output"
)
function Split-CsvByRows {
    param(
        [string]$InputFile,
        [int]$RowsPerFile,
        [string]$OutputDir
    )
    # 创建输出目录
    New-Item -ItemType Directory -Force -Path $OutputDir | Out-Null
    # 读取CSV内容
    $csvData = Import-Csv $InputFile
    $totalRows = $csvData.Count
    $chunkCount = 0
    $startRow = 0
    while ($startRow -lt $totalRows) {
        $endRow = [Math]::Min($startRow + $RowsPerFile - 1, $totalRows - 1)
        $chunk = $csvData[$startRow..$endRow]
        $outputFile = Join-Path $OutputDir ("part_{0:D4}.csv" -f $chunkCount)
        $chunk | Export-Csv -Path $outputFile -NoTypeInformation
        Write-Host "已创建: $outputFile"
        $startRow = $endRow + 1
        $chunkCount++
    }
    Write-Host "分割完成!共生成 $chunkCount 个文件"
}
# 调用函数
Split-CsvByRows -InputFile $InputFile -RowsPerFile $RowsPerFile -OutputDir $OutputDir

使用awk(Unix/Linux)

#!/bin/bash
# 使用awk高效分割CSV
split_csv_awk() {
    local input_file="$1"
    local rows_per_file="$2"
    local output_prefix="part_"
    awk -v rows="$rows_per_file" -v prefix="$output_prefix" '
    NR == 1 {
        header = $0
        file_count = 1
        print header > (prefix sprintf("%04d", file_count) ".csv")
        line_count = 1
        next
    }
    {
        if (line_count >= rows) {
            close(prefix sprintf("%04d", file_count) ".csv")
            file_count++
            print header > (prefix sprintf("%04d", file_count) ".csv")
            line_count = 0
        }
        print >> (prefix sprintf("%04d", file_count) ".csv")
        line_count++
    }
    ' "$input_file"
}
# 使用
# split_csv_awk "large_file.csv" 1000

使用建议

  1. 小文件(<100MB):使用Python或PowerShell
  2. 大文件(>1GB):使用awk或Bash脚本(内存占用低)
  3. Windows环境:使用PowerShell脚本
  4. 跨平台需求:使用Python脚本

安装依赖

Python方法需要安装pandas:

pip install pandas

这些脚本都会保留CSV文件的表头,确保每个分割文件都是完整的CSV格式。

抱歉,评论功能暂时关闭!