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 블록을 사용하여 명시적으로 작성하고 필터의 나머지 부분이 이를 따르도록 할 수도 있습니다. 표현식이 실패하면 선택적 연산자 뒤의 필터 부분을 건너뜁니다.try
try .?