Ubuntu

使用 jq 將 json 轉換為 csv 時處理 null(空數組)?

  • July 16, 2019

嘗試將 json 轉換為 csv 時,我通過以下jq查詢收到關於 null 的錯誤:

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語法看起來不錯,但我剛開始使用這個工具時對它並不熟悉。

有人可以解釋如何在數組為空時修補查詢以不輸出任何內容嗎?(第一個例子)。

您可以使用錯誤抑制/可選運算符:?阻止以對抗空數組呼叫並返回而不向控制台拋出任何錯誤

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

where.?也可以使用trycatch 塊顯式編寫,try .?並在其後放置過濾器的其餘部分。如果表達式失敗,則跳過可選運算符之後的過濾器部分。

引用自:https://unix.stackexchange.com/questions/530349