jq를 사용하여 열 중심 JSON의 값을 CSV 형식으로 추출합니다.

jq를 사용하여 열 중심 JSON의 값을 CSV 형식으로 추출합니다.

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

관련 정보