PowerShell ConvertFrom-Json 如何按嵌套数组属性名匹配取值导出CSV
PowerShell 动态匹配嵌套标签值导出CSV实现方案
你原来用固定数组索引的写法之所以适配不了变动的标签顺序,核心问题是把标签位置写死了——完全不需要依赖索引,直接在自定义计算属性的表达式里,通过标签的Name属性做精准过滤匹配,就能拿到对应的值。
具体修改方式
把原来写死索引的表达式段:
# 原来的固定索引写法,受标签排列顺序直接影响 {$_.ItemTags[3].Value}
替换为按Name属性过滤的逻辑:
# 动态匹配写法,完全不受标签排列顺序影响 {$_.ItemTags.Where({$_.Name -eq '你要提取的标签名'}).Value}
完整可复用代码
# 读取JSON时加-Raw参数避免逐行解析的格式异常 $jsonData = Get-Content -Path "C:\Temp\sample.json" -Raw | ConvertFrom-Json $jsonData | Select-Object ` ItemName, ItemID, ItemDate, ItemValue, # 提取Name为"Tag 4"的标签对应值 @{Name = 'Tag 4'; Expression = {$_.ItemTags.Where({$_.Name -eq 'Tag 4'}).Value}}, # 如果需要提取其他标签,直接新增同款计算属性即可,比如提取"Another tag name"的值 @{Name = 'Another tag name'; Expression = {$_.ItemTags.Where({$_.Name -eq 'Another tag name'}).Value}} | Export-Csv "C:\Temp\items.csv" -NoTypeInformation -Encoding UTF8
注意事项
- 代码里用的
Where()是PowerShell内置的数组原生方法,相比管道接Where-Object性能更高,处理包含数十个标签的大JSON也不会有明显性能损耗 - 如果同一个Item下存在重名的标签(同一个Name出现多次),该方法会自动把所有匹配的Value拼接为逗号分隔的字符串,符合CSV的列存储格式
- 匹配时如果需要忽略标签名的大小写差异,把判断运算符
-eq替换为-ieq即可 - 没有匹配到对应标签时,表达式会自动返回空值,不会出现索引越界的报错
- 导出CSV时指定
-Encoding UTF8可以避免中文内容乱码
内容的提问来源于stack exchange,提问作者wd510
相关产品推荐
相关产品推荐

