我已经浏览了多个线程,但是无法找到解决我问题的方法。基本上我有一个看起来像这样的数组:
我最终试图按状态对它进行分组,然后将其转换为json并显示如下输出:
{
"NY": [
"auto",
"food"
],
"CA": [
"retail",
"health",
"auto"
],
"TX": [
"retail",
"insurance"
]
}
我对如何完成此工作有些困惑,似乎无法将其转换为我想要的格式。任何帮助将不胜感激。谢谢!
答案 0 :(得分:2)
您需要构建一个与您要输出的JSON格式完全相同的对象,在您的特定情况下,最简单的方法可能是:
second_val
将准确输出:
$Data = @(
[PSCustomObject]@{State="NY";Type="auto"}
[PSCustomObject]@{State="NY";Type="food"}
[PSCustomObject]@{State="CA";Type="retail"}
[PSCustomObject]@{State="CA";Type="health"}
[PSCustomObject]@{State="CA";Type="auto"}
[PSCustomObject]@{State="TX";Type="retail"}
[PSCustomObject]@{State="TX";Type="insurance"}
)
$Obj = @{}
foreach ($Group in ($Data | Group State)) {
$Obj[$Group.Name] = ($Group.Group | Select -Expand Type)
}
$Obj | ConvertTo-Json
格式化的方式会根据输入和输出格式的不同而有很大差异,但是希望这也可以帮助您了解类似问题。
答案 1 :(得分:1)
您没有显示任何代码,因此我们假设您的数据来自csv文件
> import-csv .\data.csv
State Type
----- ----
NY auto
NY food
CA retail
CA health
CA auto
TX retail
TX insurance
按状态分组会产生以下结果:
Import-Csv .\data.csv | Group-Object state
Count Name Group
----- ---- -----
2 NY {@{State=NY; Type=auto}, @{State=NY; Type=food}}
3 CA {@{State=CA; Type=retail}, @{State=CA; Type=health}, @{State=CA; Type=auto}}
2 TX {@{State=TX; Type=retail}, @{State=TX; Type=insurance}}
但是您只需要一次状态和每个组中的类型,
因此,请尝试展开数组和ConvertTo-Json:
> Import-Csv .\data.csv|Group-Object state|ForEach{@{$_.Name = $_.Group.Type}}|ConvertTo-Json
[
{
"NY": [
"auto",
"food"
]
},
{
"CA": [
"retail",
"health",
"auto"
]
},
{
"TX": [
"retail",
"insurance"
]
}
]
这看起来很相似,但不是期望的。
尝试以其他方式转换时查看对象的外观:
@"
{
"NY": [
"auto",
"food"
],
"CA": [
"retail",
"health",
"auto"
],
"TX": [
"retail",
"insurance"
]
}
"@ | ConvertFrom-Json
NY CA TX
-- -- --
{auto, food} {retail, health, auto} {retail, insurance}
这时我打算中止课程,并给您留下一些编码,
但是colsw好的答案可以帮助您摆脱困境。
答案 2 :(得分:0)
这是使用命令行工具jq的解决方案。为简化起见,我们假设以下jq脚本位于名为program.jq的文件中,并且文件States.csv包含状态/类型表作为CSV文件:
[inputs | sub(",";"\t") | split("\t") | {state: .[0], type: .[1]}]
| group_by(.state)
| map({ (.[0]|.state) : map(.type)})
| add
这会将每行中的第一个“,”更改为制表符,然后拆分行,形成对象等。
如果states.csv具有标题行:
jq -nR -f program.jq states.csv
否则,只需使用-R而不是-nR。