使用具有多列 headers 和多行的 Powershell convert JSON
Using Powershell convert JSON with multiple column headers and rows
我已经使用 开始了。但是,我有以下 JSON 数据,其中包含多列 headers 和包含多组数据的行。
{
"columnHeaders": {
"dimensions": [
"year_month",
"tag1",
"computer_name",
"account_name",
"resource_name",
"category3",
"tag8",
"tag11",
"db_engine"
],
"metrics": [
{
"name": "usage_amount",
"dataType": "float"
},
{
"name": "pretax_cost",
"dataType": "currency"
},
{
"name": "actial_cost",
"dataType": "currency"
}
]
},
"rows": [
{
"dimensions": [
"2022-04",
"(not set)",
"server1",
"account1",
"server1_bios_name",
"undefined",
"(not set)",
"(not set)",
"SQLServer"
],
"metrics": [
{
"count": "1",
"max": "0.52",
"min": "0.10",
"sum": "0.52"
},
{
"count": "1",
"max": "-22.24",
"min": "-22.24",
"sum": "-22.24"
},
{
"count": "1",
"max": "1.26",
"min": "0",
"sum": "1.52"
}
]
}
]
}
如果我使用最后一个建议,我可以获得很好的尺寸,但我需要每个指标的“总和”值。
$A = Get-Content 'C:\Temp\sample.json' | ConvertFrom-Json
$Rows =
ForEach($Row in $A.rows )
{
$TmpHashCol = [Ordered]@{}
$TmpHashMet = [Ordered]@{}
For($i = 0; $i -lt $Row.dimensions.Length; ++$i )
{
$TmpHashCol.Add($A.columnHeaders.dimensions[$i],$Row.dimensions[$i])
#For($s = 0; $s -lt $Row.metrics.length; ++$s )
# {
$TmpHashMet.Add($A.columnHeaders.metrics.name[$i],$Row.metrics.sum[$i])
#$TmpHashMet.Add($A.columnHeaders.metrics[$i],$Row.metrics.sum[$i])
# }
}
对于“$TmpHashMet”,我收到错误:使用“2”个参数调用“添加”时出现异常:“密钥不能为空。但是,当我尝试指定名称时,它不喜欢那个。
这是我希望数据完成后的样子:
year_month : 2022-04
tag1 : (not set)
computer_name : server1
account_name : account1
resource_name : server1_bios_name
category3 : undefined
tag8 : (not set)
tag11 : (not set)
db_engine : SQLServer
usage_amount : 0.52
pretax_cost : -22.24
actial_cost : 1.52
非常感谢!!!
这是您可以做到的一种方法,您需要为 .metrics.sum
上的值创建一个新的内部循环,我还稍微修改了您的代码,以便它在 Json 超过 1 行的情况下工作。
$headers = $json.columnHeaders.dimensions
$metrics = $json.columnHeaders.metrics.name
foreach($row in $json.rows) {
$out = [ordered]@{}
for($i = 0; $i -lt $row.dimensions.Count; $i++) {
$out[$headers[$i]] = $row.dimensions[$i]
}
for($i = 0; $i -lt $metrics.Count; $i++) {
$out[$metrics[$i]] = $row.metrics.sum[$i]
}
[pscustomobject] $out
}
输出应该类似于您想要的:
year_month : 2022-04
tag1 : (not set)
computer_name : server1
account_name : account1
resource_name : server1_bios_name
category3 : undefined
tag8 : (not set)
tag11 : (not set)
db_engine : SQLServer
usage_amount : 0.52
pretax_cost : -22.24
actial_cost : 1.52
我已经使用
{
"columnHeaders": {
"dimensions": [
"year_month",
"tag1",
"computer_name",
"account_name",
"resource_name",
"category3",
"tag8",
"tag11",
"db_engine"
],
"metrics": [
{
"name": "usage_amount",
"dataType": "float"
},
{
"name": "pretax_cost",
"dataType": "currency"
},
{
"name": "actial_cost",
"dataType": "currency"
}
]
},
"rows": [
{
"dimensions": [
"2022-04",
"(not set)",
"server1",
"account1",
"server1_bios_name",
"undefined",
"(not set)",
"(not set)",
"SQLServer"
],
"metrics": [
{
"count": "1",
"max": "0.52",
"min": "0.10",
"sum": "0.52"
},
{
"count": "1",
"max": "-22.24",
"min": "-22.24",
"sum": "-22.24"
},
{
"count": "1",
"max": "1.26",
"min": "0",
"sum": "1.52"
}
]
}
]
}
如果我使用最后一个建议,我可以获得很好的尺寸,但我需要每个指标的“总和”值。
$A = Get-Content 'C:\Temp\sample.json' | ConvertFrom-Json
$Rows =
ForEach($Row in $A.rows )
{
$TmpHashCol = [Ordered]@{}
$TmpHashMet = [Ordered]@{}
For($i = 0; $i -lt $Row.dimensions.Length; ++$i )
{
$TmpHashCol.Add($A.columnHeaders.dimensions[$i],$Row.dimensions[$i])
#For($s = 0; $s -lt $Row.metrics.length; ++$s )
# {
$TmpHashMet.Add($A.columnHeaders.metrics.name[$i],$Row.metrics.sum[$i])
#$TmpHashMet.Add($A.columnHeaders.metrics[$i],$Row.metrics.sum[$i])
# }
}
对于“$TmpHashMet”,我收到错误:使用“2”个参数调用“添加”时出现异常:“密钥不能为空。但是,当我尝试指定名称时,它不喜欢那个。
这是我希望数据完成后的样子:
year_month : 2022-04
tag1 : (not set)
computer_name : server1
account_name : account1
resource_name : server1_bios_name
category3 : undefined
tag8 : (not set)
tag11 : (not set)
db_engine : SQLServer
usage_amount : 0.52
pretax_cost : -22.24
actial_cost : 1.52
非常感谢!!!
这是您可以做到的一种方法,您需要为 .metrics.sum
上的值创建一个新的内部循环,我还稍微修改了您的代码,以便它在 Json 超过 1 行的情况下工作。
$headers = $json.columnHeaders.dimensions
$metrics = $json.columnHeaders.metrics.name
foreach($row in $json.rows) {
$out = [ordered]@{}
for($i = 0; $i -lt $row.dimensions.Count; $i++) {
$out[$headers[$i]] = $row.dimensions[$i]
}
for($i = 0; $i -lt $metrics.Count; $i++) {
$out[$metrics[$i]] = $row.metrics.sum[$i]
}
[pscustomobject] $out
}
输出应该类似于您想要的:
year_month : 2022-04
tag1 : (not set)
computer_name : server1
account_name : account1
resource_name : server1_bios_name
category3 : undefined
tag8 : (not set)
tag11 : (not set)
db_engine : SQLServer
usage_amount : 0.52
pretax_cost : -22.24
actial_cost : 1.52