jqを使用してjsonをcsvに変換するときにnull(空の配列)を処理しますか?

jqを使用してjsonをcsvに変換するときにnull(空の配列)を処理しますか?

jsonをcsvに変換しようとすると、次のクエリでnullのエラーが発生しますjq

printf "[]" | jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'

次のエラーが発生します。

jq: error (at <stdin>:0): Cannot iterate over null (null)

しかし、json配列が空ではなく、その中にオブジェクトがある場合、それはうまくいきます。

$ printf '[{"a":1}]' | jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'
"a"
1

構文はjq良く見えますが、このツールを使い始めたばかりだからなじみがありません。

配列が空のときに何も出力しないようにクエリをパッチする方法を誰かが説明できますか? (最初の例)。

答え1

あなたはそれを使用することができますエラー抑制/オプションの演算子:?以下のように空の配列呼び出しを防ぎ、コンソールにエラーを発生させることなく返します。

printf '[]' | jq -r '.? |(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'

whereは.?catchブロックを使用して明示的に作成し、フィルタの残りの部分がそれに従うようにすることもできます。式が失敗した場合は、オプションの演算子の後ろのフィルタ部分をスキップします。trytry .?

関連情報