如何仅使用 jq 将嵌套的 JSON 转换为 CSV

Abh*_*hek 2 csv json nested jq

我在关注 json,

{
    "A": {
        "C": {
            "D": "T1",
            "E": 1
        },
        "F": {
            "D": "T2",
            "E": 2
        }
    },
    "B": {
        "C": {
            "D": "T3",
            "E": 3
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将其转换为 csv,如下所示,

A,C,T1,1
A,F,T2,2
B,C,T3,3
Run Code Online (Sandbox Code Playgroud)

输出描述:父键将被打印,直到我到达叶子子节点。一旦我到达叶子孩子,打印它的价值。

我试过跟随但无法成功,

猫 my.json | jq -r '(map(keys) | add | unique) as $cols | map(.as $row | $cols | map($row[.])) as $rows | $行[] | @csv'

它给我一个错误。

我无法对父键进行硬编码,因为实际的 json 有太多记录。但是json的结构是类似的。我错过了什么?

pea*_*eak 5

一些要求不清楚,但以下解决了对问题的一种解释:

paths as $path
| {path: $path, value: getpath($path)}
| select(.value|type == "object" )
| select( [.value[]][0] | type != "object")
| .path + ([.value[]])
| @csv
Run Code Online (Sandbox Code Playgroud)

(该程序可以优化,但此处的演示旨在使单独的步骤清晰。)

调用:

jq -r -f leaves-to-csv.jq input.json
Run Code Online (Sandbox Code Playgroud)

输出:

"A","C","T1",1
"A","F","T2",2
"B","C","T3",3
Run Code Online (Sandbox Code Playgroud)

未加引号的字符串

为了避免字符串周围的引号,您可以将上面管道的最后一个组件替换为:

join(",")
Run Code Online (Sandbox Code Playgroud)