如何使用Powershell补全文本行缺失的逗号分隔符并生成新文件
问题分析
你原有脚本存在几个核心问题导致无法输出正确结果:
- 未定义
${lines}变量,判断条件$i -ne ${lines}无意义,会导致部分符合补全条件的行被跳过 - 没有收集所有处理后的行,仅保留了最后一次修改的
$varline,最终导出文件只会有最后一行内容 ",".PadRight($d, ",")写法冗余,直接生成对应数量的逗号即可- 重复打开两次源文件,不必要的IO操作可以优化
普通文件通用脚本(适合GB级以下文件)
# 配置源文件和输出文件路径 $sourcePath = 'C:\Test\File1.csv' $outputPath = 'C:\Test\TestMod.csv' # 读取所有行 $allLines = Get-Content -Path $sourcePath if ($allLines.Count -eq 0) { Write-Warning "源文件为空" exit } # 取首行的字段数作为标准值 $standardFieldCount = $allLines[0].Split(",").Count $processedLines = @() foreach ($line in $allLines) { $currentFieldCount = $line.Split(",").Count if ($currentFieldCount -lt $standardFieldCount) { # 计算差额,补充对应数量的逗号 $addCommas = $standardFieldCount - $currentFieldCount $processedLine = $line + ("," * $addCommas) } else { # 字段数达标的行直接保留原内容 $processedLine = $line } $processedLines += $processedLine } # 导出结果,可按需添加-Encoding参数指定文件编码 $processedLines | Set-Content -Path $outputPath
超大文件优化脚本(适合GB级以上大文件,内存占用更低)
如果源文件体积很大,用流处理避免一次性加载所有内容到内存:
$sourcePath = 'C:\Test\File1.csv' $outputPath = 'C:\Test\TestMod.csv' $reader = [System.IO.StreamReader]::new($sourcePath) $writer = [System.IO.StreamWriter]::new($outputPath) try { # 处理首行,计算标准字段数 $firstLine = $reader.ReadLine() $writer.WriteLine($firstLine) $standardFieldCount = $firstLine.Split(",").Count while ($null -ne ($line = $reader.ReadLine())) { $currentFieldCount = $line.Split(",").Count if ($currentFieldCount -lt $standardFieldCount) { $line += "," * ($standardFieldCount - $currentFieldCount) } $writer.WriteLine($line) } } finally { $reader.Close() $writer.Close() }
内容的提问来源于stack exchange,提问作者HJ van Rooyen
相关产品推荐
相关产品推荐

