Powershell JSON 管道将多个值扩展到一列 csv
Powershell JSON pipeline expand multiple values into one column csv
我正在尝试使用 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
s。所以像这样:
uid | educationLevel
----+------------------
1 |
2 |
3 |
4 | barchelor, master
5 | master
通常我希望 Expandproperty 下降到较低级别,但这对这种情况不起作用,因为每个 EducationHistory 条目都在该特定条目的 euid 后面。由于记录的数量,像下面的示例一样扩展它们中的每一个是不可行的。
所以我想我需要一些循环,但我不知道怎么做。希望您能够帮助我。首先 post 这里是 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
$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
.
你的第一个问题,我相信我的第一个答案:) 与上一个答案相似。您需要跳过在教育历史中查找对象名称的步骤才能引用它们。
$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
我正在尝试使用 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
s。所以像这样:
uid | educationLevel
----+------------------
1 |
2 |
3 |
4 | barchelor, master
5 | master
通常我希望 Expandproperty 下降到较低级别,但这对这种情况不起作用,因为每个 EducationHistory 条目都在该特定条目的 euid 后面。由于记录的数量,像下面的示例一样扩展它们中的每一个是不可行的。
所以我想我需要一些循环,但我不知道怎么做。希望您能够帮助我。首先 post 这里是 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
$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
.
你的第一个问题,我相信我的第一个答案:) 与上一个答案相似。您需要跳过在教育历史中查找对象名称的步骤才能引用它们。
$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