基于计数CSV生成重复数值CSV的PowerShell解决方案求助
PowerShell 实现计数型CSV展开为重复数值行
需求场景
将每行格式为数值,重复次数的CSV文件,转换为每行仅包含单个数值、且数值重复对应次数的CSV文件(例如输入100,3输出3行100),解决Excel宏处理百万级记录时的崩溃问题。
高效处理脚本
以下脚本采用逐行读取+原生.NET方法优化,内存占用极低,适合大规模数据处理:
# 替换为实际的输入、输出文件路径 $inputCsv = "C:\data\input_counts.csv" $outputCsv = "C:\data\output_expanded.csv" # 读取输入文件,跳过表头(如果有表头则保留此行,无则删除Select-Object -Skip 1) Get-Content $inputCsv -Encoding utf8 | Select-Object -Skip 1 | ForEach-Object { # 分割数值与计数,限制分割次数避免数值含逗号的情况 $splitLine = $_ -split ',', 2 if ($splitLine.Count -ne 2) { Write-Warning "格式错误,跳过行: $_" return } $value = $splitLine[0].Trim() $countStr = $splitLine[1].Trim() # 验证计数为有效正整数 if (-not [int]::TryParse($countStr, [ref]$count) -or $count -lt 1) { Write-Warning "无效计数,跳过行: $_" return } # 一次性生成所有重复行(比PowerShell循环高效数倍) [System.Linq.Enumerable]::Repeat($value, $count) -join "`n" } | Out-File $outputCsv -Encoding utf8
关键优化说明
- 低内存占用:
Get-Content逐行读取文件,不会将整个百万级数据集加载到内存 - 高效生成重复行:使用.NET的
Enumerable.Repeat方法批量生成重复内容,避免PowerShell原生循环的性能损耗 - 格式容错:包含基础的格式校验,跳过无效行并输出警告
可选调整
- 如果输入文件没有表头,删除
Select-Object -Skip 1语句 - 若数值或计数包含空格,
Trim()方法可去除多余空格,无需保留可删除 - 如需输出标准CSV格式(带表头),可在脚本开头添加
"Value" | Out-File $outputCsv -Encoding utf8,并将$value改为"$value"确保输出为带引号的合规格式
内容的提问来源于stack exchange,提问作者bedmountain
相关产品推荐
相关产品推荐

