我有一个看起来像这样的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等。对于学科也是如此。
CSV转换/导出cmdlet无法“展平”对象,并且可能丢失了一些东西,但是我不知道如何使用内置cmdlet或功能来做到这一点。如果可以保证disciplines并且areas始终具有相同数量的元素,则可以通过Select- Object与派生属性一起使用来对其进行琐碎处理:
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%工作,但我认为这些想法很可靠=)