Ao tentar converter json para csv, recebo um erro sobre null com a seguinte jq
consulta:
printf "[]" | jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'
Dá o seguinte erro,
jq: error (at <stdin>:0): Cannot iterate over null (null)
mas funciona bem se o array json não estiver vazio e tiver um objeto nele:
$ printf '[{"a":1}]' | jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'
"a"
1
A jq
gramática parece ótima, mas não estou familiarizado com ela, pois comecei a usar essa ferramenta.
Alguém pode explicar como corrigir a consulta para não produzir nada quando a matriz estiver vazia? (primeiro exemplo).
Você pode usar um operador de supressão de erros/opcional: ? block para contrariar uma invocação de array vazio e retornar sem lançar nenhum erro para o console como
where
.?
também pode ser escrito explicitamente usando umtry
bloco catch astry .?
e ter o resto do filtro seguindo-o. A parte do filtro após o operador opcional será ignorada se a expressão falhar.