PowerShell单管道批量更新CSV多列值实现方案咨询
PowerShell 批量CSV逐行处理解决方案
核心问题修正
你原来的代码存在两个核心问题:
- 三次独立调用
Import-CSV+Export-CSV,重复读写磁盘,性能极低,还会多次覆盖输出文件 Switch($_)的写法误用了PowerShell Switch的匹配逻辑:你把行对象作为匹配值传入,后续分支返回的是布尔值,二者永远无法匹配,所以分支都不生效
最优流式处理方案(无全量内存加载)
该方案全程走管道逐行处理,不会把整个CSV加载到内存,完美适配超大数据量场景,同时合并所有逻辑为单次操作:
Import-Csv $Filepath | ForEach-Object { # 用无参数Switch的脚本判断模式,自动执行所有符合条件的分支 Switch { [string]::IsNullOrEmpty($_."Type of Admission") { $_."Type of Admission" = "9" } ([string]::IsNullOrEmpty($_."Service from Dates") -and -not [string]::IsNullOrEmpty($_."Service to Dates")) { $_."Service from Dates" = $_."Service to Dates" } ($_."Financial Class" -eq "Self-Pay") { $_."Payer" = $_."Health Plan Identification Number" = $_."Financial Class" } } # 处理完成的行直接输出到下游管道 $_ } | Export-Csv $NewFilepath -UseQuotes AsNeeded -Encoding UTF8
ArrayList暂存方案(如需中途操作全量数据)
如果你需要暂存处理后的数据做二次校验/操作,可以用你提到的ArrayList方案,性能稳定:
# 初始化ArrayList,避免普通数组的扩容性能损耗 $outList = [System.Collections.ArrayList]::new() Import-Csv $Filepath | ForEach-Object { Switch { [string]::IsNullOrEmpty($_."Type of Admission") { $_."Type of Admission" = "9" } ([string]::IsNullOrEmpty($_."Service from Dates") -and -not [string]::IsNullOrEmpty($_."Service to Dates")) { $_."Service from Dates" = $_."Service to Dates" } ($_."Financial Class" -eq "Self-Pay") { $_."Payer" = $_."Health Plan Identification Number" = $_."Financial Class" } } # 添加到列表,$null接收返回值避免控制台输出索引 $null = $outList.Add($_) } $outList | Export-Csv $NewFilepath -UseQuotes AsNeeded -Encoding UTF8
文件夹批量处理方案
如果需要对指定文件夹下所有CSV执行相同处理,直接套入文件遍历逻辑即可:
# 替换为你的CSV存放文件夹路径 $csvFolder = "C:\你的CSV文件夹路径" Get-ChildItem -Path $csvFolder -Filter *.csv -File | ForEach-Object { $inputPath = $_.FullName # 输出文件命名规则:原文件名_更新后.csv $outputPath = Join-Path -Path $_.DirectoryName -ChildPath ($_.BaseName + "_更新后.csv") Import-Csv $inputPath | ForEach-Object { Switch { [string]::IsNullOrEmpty($_."Type of Admission") { $_."Type of Admission" = "9" } ([string]::IsNullOrEmpty($_."Service from Dates") -and -not [string]::IsNullOrEmpty($_."Service to Dates")) { $_."Service from Dates" = $_."Service to Dates" } ($_."Financial Class" -eq "Self-Pay") { $_."Payer" = $_."Health Plan Identification Number" = $_."Financial Class" } } $_ } | Export-Csv $outputPath -UseQuotes AsNeeded -Encoding UTF8 }
内容的提问来源于stack exchange,提问作者immobile2
相关产品推荐
相关产品推荐

