问题描述
我想创建一个带有嵌套对象数组的 JSON,其中包含针对不同字段的分组。 这是 CSV,我想按 sid、年份和季度(前三个字段)对其进行分组:
S4446B3,2020,202001,2,345.45
S4446B3,4,24.44
S4446B3,2021,202102,5,314.55
S6506LK,202002,3,376.55
S6506LK,202003,76.23
split("\n")
| map(split(","))
| .[0:]
| map({"sid" : .[0],"year" : .[1],"quarter" : .[2],"customer_type" : .[3],"obj" : .[4]})
但是对于每个 sid,我想得到一个嵌套的对象数组,如下所示:
[
{
"sid" : "S4446B3","years" : [
{
"year" : 2020,"quarters" : [
{
"quarter" : 202001,"customer_type" : [
{
"type" : 2,"obj" : "345.45"
},{
"type" : 4,"obj" : "24.44"
}
]
}
]
},{
"year" : 2021,"quarters" : [
{
"quarter" : 202102,"customer_type" : [
{
"type" : 5,"obj" : "314.55"
}
]
}
]
}
]
},{
"sid" : "S6506LK","quarters" : [
{
"quarter" : 202002,"customer_type" : [
{
"type" : 3,"obj" : "376.55"
}
]
},{
"quarter" : 202003,"obj" : "76.23"
}
]
}
]
}
]
}
]
解决方法
如果将 sid、年份、季度等作为键名会更直观。使用命令行上的 -R/--raw-input
和 -n/--null-input
选项,可以这样做:
reduce (inputs / ",")
as [$sid,$year,$quarter,$type,$obj]
(.; .[$sid][$year][$quarter] += [{$type,$obj}])
而且,为了获得预期的输出,您可以将这些行附加到上述程序中。
| .[][] |= (to_entries | map({quarter: .key,customer_type: .value}))
| .[] |= (to_entries | map({year: .key,quarters: .value}))
| . |= (to_entries | map({sid: .key,years: .value}))