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"

2つのコマンドだけを実行してみてください。

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

しかし、2番目は失敗します。

"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   |
+--------+---------+

--j2pyesの略語です--ijson --opprint。)

または--barred

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

答え2

わかりました:

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

ストリームを「消費」するのを防ぐために、括弧内にどの部分でも入れることができるようです(これが名前なのかjqドキュメントに何も見つからないのでここに持って来るのかはわかりません。そしてそこに様々なブログやスタックオーバーフローに散らばっている部分ですべてをまとめる作業が必要なので、これを行うための「正しい」方法がある場合はお知らせください。

ところで、私と同じシェル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

関連情報