JQ를 사용하여 JSON을 헤더와 함께 CSV로 내보내기

JQ를 사용하여 JSON을 헤더와 함께 CSV로 내보내기

다음과 유사한 (사전?) JSON 파일이 있습니다.

{
  "Salad": {
    "name": "Dressing",
    "good": true,
    "status": true
  },
  "Data_XML": {
    "name": "XML",
    "good": false
  },
  "Functionality": {
    "name": "FUNC",
    "good": true
  },
  "Data_JSON": {
    "name": "JSON",
    "good": true,
    "status": false
  }
}

다음과 같은 CSV 출력을 찾고 있습니다.

"title","good","name","status"
"Salad",true,"Dressing",true
"Data_XML",false,"XML",""
"Functionality",true,"FUNC",""
"Data_JSON",true,"JSON",false

무엇내가 찾았어제가 지금까지 사용해왔던 방법입니다..

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

산출:

"good","name","status"
true,"Dressing",true
false,"XML",
true,"FUNC",
true,"JSON",false

나는 동등한 것이 필요하다샐러드, Data_XML, 함수 및 Data_JSON~처럼열 1(정렬되지 않음) 및 관련 데이터.

에 관해서는"좋음", "이름", "상태"이는 헤더 필드가 되며 무작위이므로 동적으로 검색해야 합니다(데이터 세트당 4개가 있을 수 있고 다른 데이터 세트에는 10개가 있을 수 있음). 이것은 상대적으로 큰 파일이고 "제목"을 첫 번째 열 헤더 항목으로 남겨두기 때문에 수동으로 구문 분석하기가 어렵습니다."제목", "좋음", "이름", "상태", "뭔가", "기타", "무작위", "기타"

너무 가까워진 것 같아요... 어떤 도움이라도 대단히 감사하겠습니다!

답변1

나는 이것이 효과가 있을 것이라고 생각합니다:

jq  -r '["title","name","good","status"],(to_entries|.[]|  
        [.key,.value.good,.value.name,
          (if .value.status == null then "" else .value.status end )]
        )|@csv'

새 버전은 더욱 다양해졌습니다.

jq -r ' to_entries as $row | 
  ( ( map(keys_unsorted ) | add | unique ) as $cols |
    ( ["title" , $cols] | flatten) , 
  ( $row | .[] as $onerow | $onerow | 
       ( [ .key , ( $cols |   
           map ($onerow.value[.] as $v | if $v == null then "" else $v end )  ) ] 
         | flatten ) ) ) | @csv '

관련 정보