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 .?

관련 정보