过滤源数据后按条件修改ResultName列名的PowerShell需求
满足特定条件修改CSV中ResultName列的PowerShell实现
嘿,针对你需要在满足特定条件时修改CSV文件里ResultName列名的需求,我整理了一套PowerShell的实现方案,具体如下:
核心需求场景
- 场景1:当
TypeIndicator为10的行中,Indicator字段为空或!,且TypeIndicator为ND的行中,Indicator字段也为空或!时:- 选中
ND对应的行,创建新行 - 将新行的
ResultName修改为类似"Al estimated"的格式 - 保留原行中Result相关的所有内容
- 选中
完整实现代码
# 定位目标CSV文件(匹配q:\test\2018\03\27路径下的sample.*格式文件) $file = Get-ChildItem "q:\test\2018\03\27\sample.*" # 导入CSV数据并按ResultName分组处理 $processedData = Import-Csv $file.FullName | Group-Object ResultName | ForEach-Object { # 筛选当前分组内TypeIndicator为10和ND的行 $tenRows = $_.Group | Where-Object { $_.TypeIndicator -eq '10' } $ndRows = $_.Group | Where-Object { $_.TypeIndicator -eq 'ND' } # 判断是否满足场景1的条件:10行的Indicator为空或!,且ND行的Indicator也为空或! $meetsCondition = ($tenRows.Indicator -match '^$|!') -and ($ndRows.Indicator -match '^$|!') if ($meetsCondition) { # 遍历所有ND行,创建新行并修改ResultName foreach ($ndRow in $ndRows) { # 复制原ND行的所有属性,避免破坏原数据 $newRow = $ndRow.PSObject.Copy() # 修改ResultName为「原名称 + estimated」的格式 $newRow.ResultName = "$($ndRow.ResultName) estimated" # 先输出原ND行,再输出新创建的行 $ndRow $newRow } # 输出分组内的10行数据 $tenRows } else { # 不满足条件时,直接输出当前分组的所有原始行 $_.Group } } # 将处理后的数据导出回CSV(建议操作前先备份原文件!) $processedData | Export-Csv -Path $file.FullName -NoTypeInformation -Encoding UTF8
代码细节说明
- 用
Get-ChildItem(可缩写为gci)精准定位目标文件,支持匹配sample.*格式的所有相关文件 - 按
ResultName分组处理,确保同一ResultName下的10和ND行被放在一起判断条件 - 通过
PSObject.Copy()复制原行属性,保证新行保留所有Result相关字段,只修改ResultName - 导出时使用
-NoTypeInformation避免CSV文件头部生成多余的类型信息,-Encoding UTF8确保中文等特殊字符正常显示
内容的提问来源于stack exchange,提问作者Esperanza
相关产品推荐
相关产品推荐

