将 json 转换为 csv,并在 jq 中标头

Dan*_*nik 2 csv conversion json csv-simple jq

是否可以转换这个json:

[
    {
        "bytes": 276697,
        "checked": false
    },
    {
        "bytes": 276697,
        "checked": false
    }
]
Run Code Online (Sandbox Code Playgroud)

到 jq 中带有标题的表?

我试过了:

cat file.json | jq '.[] | join(",")'
Run Code Online (Sandbox Code Playgroud)

但它省略了标题:

"276697,false"
"276697,false"
Run Code Online (Sandbox Code Playgroud)

它应该是:

"bytes,checked"
"276697,false"
"276697,false"
Run Code Online (Sandbox Code Playgroud)

我希望您只需运行两个命令:

"276697,false"
"276697,false"
Run Code Online (Sandbox Code Playgroud)

但第二个失败了:

"bytes,checked"
jq: error (at <stdin>:64): Cannot iterate over null (null)

Run Code Online (Sandbox Code Playgroud)

理想情况下它会比更简单。

Kus*_*nda 5

您可以从列表中第一个元素的键中选择标题作为字符串数组,然后将所有元素的值提取为单独的数组。将@csv输出运算符应用于结果列表的每个元素将以 CSV 形式引用数据(jq引用所有字符串,但不引用布尔值或数字):

$ jq -r '[first|keys] + map([.[]]) | .[] | @csv' file
"bytes","checked"
276697,false
276697,false
Run Code Online (Sandbox Code Playgroud)

或者,

$ jq -r '(first|keys), (.[]|[.[]]) | @csv' file
"bytes","checked"
276697,false
276697,false
Run Code Online (Sandbox Code Playgroud)

或者,

$ jq -r '(first|keys), map(map(.))[] | @csv' file
"bytes","checked"
276697,false
276697,false
Run Code Online (Sandbox Code Playgroud)

或任何其他方式将值提取到单独的数组中。

请注意,这依赖于整个输入数据中的键以相同的顺序出现。

然而,使用Miller ( )则更容易mlr

$ mlr --j2c cat file
bytes,checked
276697,false
276697,false
Run Code Online (Sandbox Code Playgroud)

这只是通过 Miller 的命令传递数据cat(这样使用时,不会修改数据),同时使用选项--j2c(缩写--ijson --ocsv)将数据从 JSON 转换为 CSV。请注意,由于 Miller 能够正确识别 CSV,因此它仅引用实际需要引用的字段。

您还可以通过选择漂亮的打印输出格式以及以下命令来获得格式良好的表格--barred

$ mlr --j2p --barred cat file
+--------+---------+
| bytes  | checked |
+--------+---------+
| 276697 | false   |
| 276697 | false   |
+--------+---------+
Run Code Online (Sandbox Code Playgroud)

(--j2p是 的缩写--ijson --opprint。)

或者没有--barred

$ mlr --j2p cat file
bytes  checked
276697 false
276697 false
Run Code Online (Sandbox Code Playgroud)