json - 从 CSV 导入 JSON,按多个字段分组
问题描述
我想创建一个带有嵌套对象数组的 JSON,并为不同的字段分组。这是 CSV,我想按 sid、年份和季度(前三个字段)对其进行分组:
S4446B3,2020,202001,2,345.45
S4446B3,2020,202001,4,24.44
S4446B3,2021,202102,5,314.55
S6506LK,2020,202002,3,376.55
S6506LK,2020,202003,3,76.23
用以下内容拆分 CSV 后,我得到了每条记录的对象。
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",
"years" : [
{
"year" : 2020,
"quarters" : [
{
"quarter" : 202002,
"customer_type" : [
{
"type" : 3,
"obj" : "376.55"
}
]
},
{
"quarter" : 202003,
"customer_type" : [
{
"type" : 3,
"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}))
推荐阅读
- css - 如何在 Firefox 中缩放 div 时修复不一致的边框
- algorithm - 有向无环图算法中单源最短路径的运行时间
- wordpress - 重力形式 Razorpay 支付网关电子邮件通知
- java - 如何更改 ExpandableListView 中展开的 GroupView 背景颜色?
- java - 如何在 Spring 中从文件读取参数到 Schedule 注释?
- ios - iPhone 部署目标 12.1 或以下 (Swift) 的大型 iPA 大小
- amazon-web-services - Docker 容器在本地运行,但不在 AWS Elastic BeanStalk 上
- regex - 用于匹配特殊字母数字模式的正则表达式
- json - JSON 按特定值排序 - PERL
- angular - 在 Angular 5 中使用 ng2-pdf-viewer 导航和滚动 PDF 文件