本文目录导读:

我会为您介绍几种批量分割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
使用建议
- 小文件(<100MB):使用Python或PowerShell
- 大文件(>1GB):使用awk或Bash脚本(内存占用低)
- Windows环境:使用PowerShell脚本
- 跨平台需求:使用Python脚本
安装依赖
Python方法需要安装pandas:
pip install pandas
这些脚本都会保留CSV文件的表头,确保每个分割文件都是完整的CSV格式。