You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell调整大文件拆分代码:每个2万行TSV均带表头

大文件TSV拆分带全量表头的PowerShell实现

改动核心点

要实现每个拆分文件都带表头,不需要重写原有流式读写的逻辑,只需要在原有流程上补充几处适配:

  • 初始化读取流的时候,先单独把源文件第一行(也就是表头)读出来存成固定变量,不把这行算进每2万行的拆分批次里
  • 每一次创建新的输出流(不管是第一个文件还是后续切换的拆分文件),第一行先把存好的表头写进去,再开始写业务数据
  • 计数器只对表头之后的业务行做累计,凑够2万行就切换到下一个拆分文件
  • 给所有输出流显式指定UTF-8编码,避免原代码里StreamWriter未指定编码导致的中文乱码问题

调整后可直接运行的完整代码

$sourceFile = "C:\Users\lingaguru.c3\Desktop\Test\DE.txt"
$partNumber = 1
$batchSize = 20000
$pathAndFilename = "C:\Users\lingaguru.c3\Desktop\Test\Temp part $partNumber file.tsv"

[System.Text.Encoding]$enc = [System.Text.Encoding]::GetEncoding(65001)

$fs = New-Object System.IO.FileStream($sourceFile, "OpenOrCreate", "Read", "ReadWrite", 8, "None")
$streamIn = New-Object System.IO.StreamReader($fs, $enc)

# 单独读取首行作为公共通用表头
$tableHeader = $streamIn.ReadLine()
if (-not $tableHeader) {
    "源文件无有效内容,退出拆分流程"
    $streamIn.Close()
    return
}

# 初始化第一个拆分文件,先写入表头
$streamout = New-Object System.IO.StreamWriter($pathAndFilename, $false, $enc)
$streamout.WriteLine($tableHeader)

$counter = 0
# 从表头之后的第一行业务数据开始读入拆分
$line = $streamIn.ReadLine()
while ($null -ne $line) {
    $streamout.WriteLine($line)
    $counter++
    # 达到单文件行数阈值,切换新文件
    if ($counter -eq $batchSize) {
        $partNumber++
        $counter = 0
        $streamout.Close()
        $pathAndFilename = "C:\Users\lingaguru.c3\Desktop\Test\Temp part $partNumber file.tsv"
        # 新文件初始化时先写入表头
        $streamout = New-Object System.IO.StreamWriter($pathAndFilename, $false, $enc)
        $streamout.WriteLine($tableHeader)
    }
    $line = $streamIn.ReadLine()
}

$streamIn.Close()
$streamout.Close()
"拆分完成,共生成 $partNumber 个带表头的TSV文件"

效果说明

  • 每个生成的拆分文件结构为:1行公共表头 + 最多2万行业务数据,可直接被Excel、数据库导入工具读取
  • 完全保留原有流式读写的特性,不会因为文件过大出现内存溢出问题
  • 所有输出文件严格使用UTF-8编码,不会出现中文乱码

内容的提问来源于stack exchange,提问作者Linga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 07:36:08