首页 > 解决方案 > 从 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"
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

标签: jsonjqimport-from-csv

解决方案


如果 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}))

推荐阅读