尝试使用Powershell将复杂的JSON转换为CSV

尝试使用Powershell将复杂的JSON转换为CSV,json,powershell,csv,Json,Powershell,Csv,我是PowerShell的新手,我正在尝试将此JSON文件转换为CSV 使用以下简单代码: $sourceFilePath = "Records.json" $destinationFilePath = "Records.csv" ((Get-Content -Path $sourceFilePath -Raw) | ConvertFrom-Json) | Export-CSV $destinationFilePath -NoTypeInformation

我是PowerShell的新手,我正在尝试将此JSON文件转换为CSV

使用以下简单代码:

$sourceFilePath = "Records.json"
$destinationFilePath = "Records.csv"
((Get-Content -Path $sourceFilePath -Raw) | ConvertFrom-Json) | Export-CSV $destinationFilePath -NoTypeInformation
结果:

因为我正在获取System.Object[],我想我需要对联系人ID、站点ID、名字别名和别名进行某种扩展或“ForEach”。我已经做了一些搜索,但我似乎无法对所给的例子保持清醒的头脑。此外,“名字别名”中的空格增加了复杂性

我无法控制源JSON。以下是一个例子:

[
  {
    "mdm id" : "947b2a12-3aac-480a-a0bf-626aff106f48",
    "first name" : "Claude",
    "last name" : "Bones",
    "contact_ids" : [
      "CTP70499"
    ],
    "site_ids" : [
      "5015"
    ],
    "first name aliases" : [
      "Claude"
    ],
    "aliases" : [
      "Claude Bones"
    ],
    "createdDate" : "2020-06-03T19:59:08Z",
    "updatedDate" : "2020-06-03T20:48:27Z",
    "veevaID" : "V0B000000000569"
  },
  {
    "mdm id" : "bce21b05-0b28-4ebb-a34d-761c1a397821",
    "first name" : "Daniel",
    "last name" : "Smith",
    "contact_ids" : [
      "CTP699"
    ],
    "site_ids" : [
      "5015"
    ],
    "first name aliases" : [
      "Dan",
      "Danial",
      "Danne",
      "Danny",
      "Daniel"
    ],
    "aliases" : [
      "Daniel Smith"
    ],
    "createdDate" : "2020-06-03T19:59:08Z",
    "updatedDate" : "2020-06-03T20:48:27Z",
    "veevaID" : "V0B000000000566"
  }
]

数组中的值需要合并为单个值。不管它可能有多少个值,如果它在json中被指定为数组
[]
,则需要对其进行操作。互联网上有几篇文章和自定义函数。您的示例可以用这段代码来处理

$JSONdata = @'
[
  {
    "mdm id" : "947b2a12-3aac-480a-a0bf-626aff106f48",
    "first name" : "Claude",
    "last name" : "Bones",
    "contact_ids" : [
      "CTP70499"
    ],
    "site_ids" : [
      "5015"
    ],
    "first name aliases" : [
      "Claude"
    ],
    "aliases" : [
      "Claude Bones"
    ],
    "createdDate" : "2020-06-03T19:59:08Z",
    "updatedDate" : "2020-06-03T20:48:27Z",
    "veevaID" : "V0B000000000569"
  },
  {
    "mdm id" : "bce21b05-0b28-4ebb-a34d-761c1a397821",
    "first name" : "Daniel",
    "last name" : "Smith",
    "contact_ids" : [
      "CTP699"
    ],
    "site_ids" : [
      "5015"
    ],
    "first name aliases" : [
      "Dan",
      "Danial",
      "Danne",
      "Danny",
      "Daniel"
    ],
    "aliases" : [
      "Daniel Smith"
    ],
    "createdDate" : "2020-06-03T19:59:08Z",
    "updatedDate" : "2020-06-03T20:48:27Z",
    "veevaID" : "V0B000000000566"
  }
]
'@ | ConvertFrom-Json

$JSONdata | foreach {
    $record = [ordered]@{}
    foreach($property in $_.psobject.Properties)
    {
        if($property.value -is [string])
        {
            $record.Add($property.name,$property.value)
        }
        else
        {
            $record.Add($property.name,($property.value -join ', '))
        }
    }
    [PSCustomObject]$record
} | ConvertTo-Csv -NoTypeInformation
输出

"mdm id","first name","last name","contact_ids","site_ids","first name aliases","aliases","createdDate","updatedDate","veevaID"
"947b2a12-3aac-480a-a0bf-626aff106f48","Claude","Bones","CTP70499","5015","Claude","Claude Bones","2020-06-03T19:59:08Z","2020-06-03T20:48:27Z","V0B000000000569"
"bce21b05-0b28-4ebb-a34d-761c1a397821","Daniel","Smith","CTP699","5015","Dan, Danial, Danne, Danny, Daniel","Daniel Smith","2020-06-03T19:59:08Z","2020-06-03T20:48:27Z","V0B000000000566"

如果每个属性有多个值,只需将其更改为
导出Csv

,您想用逗号将它们连接起来吗?@DougMaurer是的,这对我很有用