CSV文件分割#
需求背景#
解决CSV文件过大,导致某些系统无法上传/识别的问题。
需求频率#
不定时。
处理代码#
param(
[string]$CsvPath = "5月产品数据.csv",
[int]$Parts = 5,
[string]$OutputDir = $PSScriptRoot
)
$reader = [System.IO.StreamReader]::new((Join-Path $OutputDir $CsvPath))
$header = $reader.ReadLine()
# 统计总行数
$totalLines = 0
while ($reader.ReadLine() -ne $null) {
$totalLines++
}
$reader.Close()
$linesPerPart = [math]::Ceiling($totalLines / $Parts)
Write-Host "总数据行: $totalLines, 每份: $linesPerPart 行"
# 重新读取,开始分割
$reader = [System.IO.StreamReader]::new((Join-Path $OutputDir $CsvPath))
$reader.ReadLine() | Out-Null # 跳过表头
$baseName = [System.IO.Path]::GetFileNameWithoutExtension($CsvPath)
for ($i = 0; $i -lt $Parts; $i++) {
$partNum = $i + 1
$outFile = Join-Path $OutputDir "${baseName}_part${partNum}.csv"
$writer = [System.IO.StreamWriter]::new($outFile, $false, [System.Text.Encoding]::UTF8)
$writer.WriteLine($header)
$lineCount = 0
while ($lineCount -lt $linesPerPart -and ($line = $reader.ReadLine()) -ne $null) {
$writer.WriteLine($line)
$lineCount++
}
$writer.Close()
Write-Host "已生成: ${baseName}_part${partNum}.csv ($lineCount 行数据)"
}
$reader.Close()
Write-Host "分割完成!"