You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell导出CSV时将JSON嵌套记录合并为单列的方法

解决PowerShell导出CSV时JSON嵌套数组转逗号分隔字符串的问题

当处理包含多层嵌套记录的JSON数据时,直接使用Export-Csv导出会导致嵌套数组字段显示为System.Object[]或对象哈希字符串,无法得到预期的逗号分隔扁平化格式。以下是具体的解决方案:

示例场景

假设你的JSON数据结构如下(包含嵌套的许可证记录):

[
  {
    "id": "1",
    "name": "ProjectA",
    "licenses": [
      {"name": "MIT", "url": "https://opensource.org/licenses/MIT"},
      {"name": "Apache-2.0", "url": "https://opensource.org/licenses/Apache-2.0"}
    ]
  },
  {
    "id": "2",
    "name": "ProjectB",
    "licenses": [
      {"name": "GPL-3.0", "url": "https://www.gnu.org/licenses/gpl-3.0.html"}
    ]
  }
]

原脚本的问题

直接导出的脚本会导致嵌套字段格式异常:

# 原脚本(导出结果不符合预期)
$jsonData = Get-Content -Path "input.json" | ConvertFrom-Json
$jsonData | Export-Csv -Path "output.csv" -NoTypeInformation

导出的CSV中,licenses列会显示为System.Object[],无法直接读取许可证名称或URL。

修改后的脚本

通过Select-Object的计算属性提取嵌套数组的指定字段,并合并为逗号分隔字符串:

# 处理嵌套字段并导出符合要求的CSV
$jsonData = Get-Content -Path "input.json" | ConvertFrom-Json

# 提取并扁平化嵌套字段
$processedData = $jsonData | Select-Object `
    id,
    name,
    @{Name = "LicenseNames"; Expression = { $_.licenses.name -join ", " } },
    @{Name = "LicenseUrls"; Expression = { $_.licenses.url -join ", " } }

# 导出处理后的数据
$processedData | Export-Csv -Path "output_flattened.csv" -NoTypeInformation

关键说明

  • 计算属性@{Name=...; Expression=...}用于自定义输出列:
    • Name指定CSV中的列名
    • Expression定义字段值的生成逻辑,通过$_.嵌套数组.属性提取目标值,再用-join ", "合并为字符串
  • 若嵌套数组为空,-join会返回空字符串,无需额外处理
  • 可根据需求修改分隔符(如改为-join "; "使用分号分隔)

复杂嵌套扩展

如果JSON存在更深层次的嵌套,比如项目依赖包数组,同样可以用相同逻辑处理:

# 处理深层嵌套示例
$processedData = $jsonData | Select-Object `
    id,
    name,
    @{Name = "LicenseNames"; Expression = { $_.licenses.name -join ", " } },
    @{Name = "DependencyPackages"; Expression = { $_.dependencies.packages.name -join ", " } }

内容的提问来源于stack exchange,提问作者rAJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:05:21