如何使用PowerShell更新重复数组对应字段的取值
解决方案
核心实现逻辑为先按Store编号分组聚合出每个Store三个布尔字段的最终取值,再统一更新所有同Store行的对应字段即可,完整调整后的代码如下:
# 导入CSV文件 $testarray = Import-Csv -Path "C:\directory\ocb2021\preprocessings.csv" # 1. 按Store分组,计算每个Store的hotel、cafe、bar是否至少存在一行为true $storeFlags = $testarray | Group-Object Store | ForEach-Object { $storeRows = $_.Group [PSCustomObject]@{ Store = $_.Name # Trim处理字段前后空格,避免格式问题导致匹配失败 hotel = [bool]($storeRows.hotel.Trim() -contains 'true') cafe = [bool]($storeRows.cafe.Trim() -contains 'true') bar = [bool]($storeRows.bar.Trim() -contains 'true') } } # 2. 遍历所有原始行,更新对应字段,其余字段保留原值 foreach ($member in $testarray) { $currentFlag = $storeFlags | Where-Object { $_.Store -eq $member.Store } | Select-Object -First 1 # 转换为小写字符串和原输出格式对齐,需要空格可自行拼接 $member.hotel = $currentFlag.hotel.ToString().ToLower() $member.cafe = $currentFlag.cafe.ToString().ToLower() $member.bar = $currentFlag.bar.ToString().ToLower() } # 输出预览结果 $testarray | Format-Table # 如需导出为新CSV可使用下方命令 # $testarray | Export-Csv -Path "C:\directory\ocb2021\processed.csv" -NoTypeInformation -Encoding UTF8
代码说明
- 采用先分组聚合的方式避免循环内重复查询,执行效率更高,同时避免了原代码中用
-match模糊匹配Store可能出现的误匹配问题 - 内置空格处理逻辑,兼容原始CSV字段前后带空格的情况
- number等非目标字段完全保留原始值不做修改,和需求要求一致。
内容的提问来源于stack exchange,提问作者Nithu
相关产品推荐
相关产品推荐

