小编典典

将嵌套的JSON数组转换为CSV文件中的单独列

json

我有一个看起来像这样的JSON文件:

{
    "id": 10011,
    "title": "Test procedure",
    "slug": "slug",
    "url": "http://test.test",
    "email": "test@test.com",
    "link": "http://test.er",
    "subject": "testing",
    "level": 1,
    "disciplines": [
      "discipline_a",
      "discipline_b",
      "discipline_c"
    ],
    "areas": [
      "area_a",
      "area_b"
    ]
  },

我试图使用以下命令将其转换为CSV文件:

(Get-Content "PATH_TO\test.json" -Raw | ConvertFrom-Json)| Convertto-CSV -NoTypeInformation | Set-Content "PATH_TO\test.csv"

但是,对于学科和领域,我在生成的CSV文件中获取System.Object []。

有没有一种方法可以将所有这些嵌套值放在CSV文件中的单独列中,例如area_1,area_2等。对于学科也是如此。


阅读 460

收藏
2020-07-27

共1个答案

小编典典

CSV转换/导出cmdlet无法“展平”对象,并且可能丢失了一些东西,但是我不知道如何使用内置cmdlet或功能来做到这一点。如果可以保证disciplines并且areas始终具有相同数量的元素,则可以通过Select- Object与派生属性一起使用来对其进行琐碎处理:

$properties=@('id','title','slug','url','email','link','subject','level',
    @{Name='discipline_1';Expression={$_.disciplines[0]}}
    @{Name='discipline_2';Expression={$_.disciplines[1]}}
    @{Name='discipline_3';Expression={$_.disciplines[2]}}
    @{Name='area_1';Expression={$_.areas[0]}}
    @{Name='area_2';Expression={$_.areas[1]}}
)
(Get-Content 'PATH_TO\test.json' -Raw | ConvertFrom-Json)| Select-Object -Property $properties | Export-CSV -NoTypeInformation -Path 'PATH_TO\test.csv'

但是,我假设,disciplines并且areas每条记录的长度都是可变的。在这种情况下,您将必须遍历输入并获取学科和领域的最高计数值,然后动态构建属性数组:

$inputData = Get-Content 'PATH_TO\test.json' -Raw | ConvertFrom-Json
$counts = $inputData | Select-Object -Property     @{Name='disciplineCount';Expression={$_.disciplines.Count}},@{Name='areaCount';Expression={$_.areas.count}}
$maxDisciplines = $counts | Measure-Object -Maximum -Property disciplineCount | Select-Object -ExpandProperty     Maximum
$maxAreas = $counts | Measure-Object -Maximum -Property areaCount | Select-Object -ExpandProperty Maximum

$properties=@('id','title','slug','url','email','link','subject','level')

1..$maxDisciplines | % {
  $properties += @{Name="discipline_$_";Expression=[scriptblock]::create("`$_.disciplines[$($_ - 1)]")}
}

1..$maxAreas | % {
  $properties += @{Name="area_$_";Expression=[scriptblock]::create("`$_.areas[$($_ - 1)]")}
}

$inputData | Select-Object -Property $properties | Export-CSV -NoTypeInformation -Path 'PATH_TO\test.csv'

该代码尚未经过全面测试,因此可能需要进行一些调整才能100%工作,但我认为这些想法很可靠=)

2020-07-27