rank
데이터가 배열의 열거 열로 저장되는 다음 JSON 파일이 있습니다 .
{
"data": [
{
"displayName": "First Name",
"rank": 1,
"value": "VALUE"
},
{
"displayName": "Last Name",
"rank": 2,
"value": "VALUE"
},
{
"displayName": "Position",
"rank": 3,
"value": "VALUE"
},
{
"displayName": "Company Name",
"rank": 4,
"value": "VALUE"
},
{
"displayName": "Country",
"rank": 5,
"value": "VALUE"
}
]
}
헤더는 열 값에서 나오고 displayName
열의 데이터는 value
단일 키 값인 다음 형식의 CSV 파일을 원합니다.
First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE
만 사용하여 이것이 가능합니까 jq
? 저는 프로그래밍 기술이 전혀 없습니다.
답변1
jq에는 배열을 CSV 문자열로 변환하는 필터 @csv가 있습니다. 이 필터는 필드에 포함된 쉼표부터 시작하여 CSV 형식과 관련된 대부분의 복잡성을 고려합니다. (JQ 1.5에는 탭으로 구분된 값 파일을 생성하기 위한 유사한 필터 @tsv가 있습니다.)
물론 제목과 값 모두에 쉼표와 큰따옴표가 없는 것이 보장된다면 @csv 필터를 사용할 필요가 없을 수도 있습니다. 그렇지 않으면 그것을 사용하는 것이 더 나을 수도 있습니다.
예를 들어 "회사 이름"이 "Smith, Smith and Smith"이고 다른 값이 다음과 같은 경우 "-r" 옵션으로 jq를 호출하면 유효한 CSV가 생성됩니다.
$ jq -r '.data | map(.displayName), map(.value) | @csv' so.json2csv.json
"First Name","Last Name","Position","Company Name","Country"
"John (""Johnnie"")","Doe","Director, Planning and Posterity","Smith, Smith and Smith","Transylvania"
답변2
저는 각 레코드를 CSV에 한 줄로 나열하는 것을 선호합니다.
jq -r '.data | map([.displayName, .rank, .value] | join(", ")) | join("\n")'
문제의 데이터가 주어지면 출력
First Name, 1, VALUE
Last Name, 2, VALUE
Position, 3, VALUE
Company Name, 4, VALUE
Country, 5, VALUE
답변3
이 파일만 있으면 다음을 수행할 수 있습니다.
<testfile jq -r '.data | map(.displayName), map(.value) | join(", ")'
운영자는 .
개체/해시에서 필드를 선택합니다. 따라서 .data
데이터가 포함된 배열을 반환하는 로 시작합니다 . 그런 다음 배열을 두 번 매핑합니다. 먼저 displayName을 선택한 다음 값을 선택하면 해당 키의 값만 포함하는 두 개의 배열이 생성됩니다. 각 배열에 대해 요소를 ","로 결합하여 두 개의 행을 형성합니다. 이 매개변수는 결과 문자열을 인용하지 않도록 -r
지시합니다 .jq
실제 파일이 더 길면(예: 여러 사람의 항목이 포함된 경우) 더 복잡한 것이 필요할 수 있습니다.
답변4
이 파일에 태그를 지정 python
하고 파일 이름 json
이 다음과 같다고 가정했기 때문에x.json
import os, json
with open('x.json') as f:
x = json.load(f)
print '{}{}{}'.format(', '.join(y['displayName'] for y in x['data']), os.linesep,
', '.join(y['value'] for y in x['data']))
First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE