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

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

是否可以转换这个json:

[
    {
        "bytes": 276697,
        "checked": false
    },
    {
        "bytes": 276697,
        "checked": false
    }
]

到 jq 中带有标题的表?

我试过了:

cat file.json | jq '.[] | join(",")'

但它省略了标题:

"276697,false"
"276697,false"

它应该是:

"bytes,checked"
"276697,false"
"276697,false"

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

cat file.json | jq '.[] | keys, .[] | join(",")'

但第二个失败了:

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

理想情况下它会比

答案1

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

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

或者,

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

或者,

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

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

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

然而,使用它更容易磨坊主( mlr):

$ mlr --j2c cat file
bytes,checked
276697,false
276697,false

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

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

$ mlr --j2p --barred cat file
+--------+---------+
| bytes  | checked |
+--------+---------+
| 276697 | false   |
| 276697 | false   |
+--------+---------+

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

或者没有--barred

$ mlr --j2p cat file
bytes  checked
276697 false
276697 false

答案2

我得到了它:

cat file.json | jq '(.[0] | keys), .[] | join(",")'

看起来你可以将任何部分放在括号中,以防止它“消耗”流(我不知道这是否是它的名字,或者即使我在这里得到它,因为我在 jq 的文档中找不到任何内容并且有将所有内容与分散在各个博客和 stackoverflow 中的零碎内容拼凑在一起,所以如果有“正确”的方法来做到这一点,请告诉我)。

顺便说一句,如果你有一个像我一样的 shell for 循环,使用 -s 选项来组合单独的 json 对象:

$ for i in {3,4,5,8} 
do rclone rc core/stats --rc-user USER --rc-pass PASS --rc-addr :557$i
done | jq -rs '(.[0] | keys), .[] | join(",")' | column -ts,

bytes      checks  deletedDirs  deletes  elapsedTime       errors  eta  fatalError  renames  retryError  speed               totalBytes  totalChecks  totalTransfers  transferTime  transfers
1660182    0       0            0        258038.009782457  0       0    false       0        false       1664.9322505627426  1660182     0            6               0             6
407752609  0       0            0        258038.054874325  0       0    false       0        false       10615.04533495996   407752609   0            86              0             86
7403585    0       0            0        258038.103563555  0       0    false       0        false       20892.381593377457  7403585     0            2               0             2
0          0       0            0        258038.156466825  0            false       0        false       0                   0           0            0               0             0

相关内容