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 "分割完成!"