我正在尝试使用Powershell自动执行一些数据管道,但是我有点坚持将JSON列表转换为CSV文件中每行的单个单元格。希望你们中的一些可以帮助我。
我得到的JSON如下所示:
{"result": [
{
"uid": "1",
"EducationHistory": []
},
{
"uid": "2",
"EducationHistory": []
},
{
"uid": "3",
"EducationHistory": []
},
{
"uid": "4",
"EducationHistory": {
"10466632": {
"euid": 10466632,
"degree": "Highschool",
"educationLevel": null
},
"10466634": {
"euid": 10466634,
"degree": "Law",
"educationLevel": "batchelor"
},
"10466635": {
"euid": 10466635,
"degree": "Law",
"educationLevel": "master"
}
}
},
{
"uid": "5",
"EducationHistory": {
"10482462": {
"euid": 10482462,
"degree": "IT",
"educationLevel": "master"
}
}
}
]
}
我要做的是在一列中收集每个uid的educationLevel
。像这样:
uid | educationLevel
----+------------------
1 |
2 |
3 |
4 | barchelor, master
5 | master
通常,我希望Expandproperty降至较低的水平,但这在这种情况下不起作用,因为每个EducationHistory条目都在该特定条目的euid后面。由于记录数量的原因,无法像下面的示例一样扩展其中的每一个。
所以我认为我需要循环,但是我不知道如何。希望您能够帮助我。首先在这里发帖和一个Powershell新手,所以我希望我的问题很清楚。如果需要更多信息,请告诉我。
一个条目的代码,例如:
$json = Get-content -raw -path C:\TEMP\File.json
(ConvertFrom-Json -InputObject $json).result |
Select-Object uid,
#Expand one of the entries:
@{Name = "Edu.Level";E={$_.EducationHistory | Select-Object -
expandproperty 10466632 |Select-Object -expandpropert degree }} |
Format-Table
答案 0 :(得分:1)
$content = Get-Content .\test.json
$result = ($content | ConvertFrom-Json).result
$totalResult = @()
foreach($res in $result) {
$tempArray = @()
if($res.EducationHistory -ne $null) {
$properties = $res.EducationHistory | Get-Member -MemberType NoteProperty
foreach($property in $properties) {
$eduLevel = $res.EducationHistory.$($property.Name).educationLevel
if(![String]::IsNullOrEmpty($eduLevel)) {
$tempArray += $eduLevel
}
}
}
$totalResult += [PSCustomObject]@{
uid = $res.uid
educationLevel = $tempArray -join ", "
}
}
$totalResult
这将为您提供的输入输出所需的结果。
最棘手的部分是EducationHistory
属性的值。您必须使用Get-Member
cmdlet(请参阅Get-Help Get-Member
)来循环获取当前对象的属性。然后使用属性名称访问educationLevel
。
答案 1 :(得分:0)
您的第一个问题,我相信我的第一个答案:)与最后一个答案相似。您需要跳过在EducationalHistory中查找对象名称以引用它们的箍。
$json = (Get-content C:\TEMP\File.json | ConvertFrom-Json).result
$results = @()
foreach ( $u in $json)
{
foreach ( $h in $u.EducationHistory)
{
$results += $h.PSObject.properties.Name | ForEach-Object{new-object PSObject -property @{ uid=$u.uid; degree=$h.$_.degree}}
}
}
$results | ConvertTo-Csv | select -skip 1