이 JSON을 CSV로 어떻게 변환할 수 있나요?

이 JSON을 CSV로 어떻게 변환할 수 있나요?

CSV로 변환하려는 다음 JSON 문서가 있습니다. 한 번의 반복으로 첫 번째, 두 번째, 세 번째 열(문자열 또는 배열일 수 있음)을 반복해야 합니다.

예시 문서:

[
  {
    "results": [
       [
        "abc025",
        "true",
        "test.lun"
      ],
       [
        "xyz025",
        [
          "true",
          "false",
          "true"
        ],
        [
          "product.lun",
          "app.lun",
          "ora.lun"
        ]
      ]
    ]
  }
]

예상 CSV:

"abc025","true","test.lun"
"xyz025","true","product.lun"
"xyz025","false","app.lun"
"xyz025","true","ora.lun"

답변1

jq표현식 사용

.[].results[] | .[0] as $name | .[1:] | map([.[]]? // [.]) |
(.[0]|keys[]) as $i | [ $name, .[][$i] ] | @csv

여기서 첫 번째 줄은 각 개별 하위 배열(각각 별도의 반복)에서 첫 번째 요소()를 선택한 $name다음 각 하위 배열()의 나머지 데이터를 열당 하나의 배열이 있는 배열로 변환합니다..[0]abc025xyz025.[1:]

[["true"],["test.lun"]]
[["true","false","true"],["product.lun","app.lun","ora.lun"]]

이는 map()각 요소가 배열로 추출되는 호출에서 수행됩니다. 이것이 작동하지 않으면 요소는 다음과 같습니다.투자하다정렬. 따라서 각 요소는 배열로 유지되거나 단일 요소 배열로 변환됩니다.

두 번째 줄은 이러한 열 배열의 인덱스를 반복하고 출력을 CSV로 생성합니다.

시험:

$ jq -r '.[].results[] | .[0] as $name | .[1:] | map([.[]]? // [.]) | (.[0]|keys[]) as $i | [ $name, .[][$i] ] | @csv' file
"abc025","true","test.lun"
"xyz025","true","product.lun"
"xyz025","false","app.lun"
"xyz025","true","ora.lun"

일반화이니 참고해주세요이전 문제에 대한 나의 해결책. 이 질문의 데이터와 함께 이 코드를 사용할 수도 있습니다.

열이 3개 이상인 데이터에도 이 방법을 사용할 수 있습니다. 문서

[
  {
    "results": [
      [ "abc025",
        "true",
        "test.lun",
        "blueberry" ],
      [ "xyz025",
        ["true","false","true"],
        ["product.lun","app.lun","ora.lun"],
        ["strawberry","cloudberry","lingonberry"] ]
    ]
  }
]

로 변환됩니다

"abc025","true","test.lun","blueberry"
"xyz025","true","product.lun","strawberry"
"xyz025","false","app.lun","cloudberry"
"xyz025","true","ora.lun","lingonberry"

관련 정보