![이 JSON을 CSV로 어떻게 변환할 수 있나요?](https://linux55.com/image/194759/%EC%9D%B4%20JSON%EC%9D%84%20CSV%EB%A1%9C%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EB%B3%80%ED%99%98%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
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]
abc025
xyz025
.[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"