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
相关产品推荐
相关产品推荐

