TEXT to JSON 변환

TEXT to JSON 변환

2023, Oct 03    

리눅스 커맨드라인에서 정형화된 텍스트를 JSON 데이터로 변환하는 방법에 대해 기록해둔다.

  • JQ 커맨드라인 툴 이용하여 JSON 구성.
  • 딜리미터을 기준으로 필드 분리
  • CSV 형식의 텍스트 데이터를 JSON 으로 변환

TEXT To JSON

정형화된 텍스트 데이터를 JSON으로 변환하기 위해 엑셀에서도 문자열 함수나 스크립트를 만들어서 가능하지만 대량의 데이터를 가공하기에는 불편해서 커맨드라인에서 빠르게 변환하는 방법에 대해 알아본다.

그동안 JSON 파서로 사용하던 jq 명령어를 활용해서 아래와 같이 텍스트 데이터셋을 JSON 형식으로 구성하는 방법을 알아본다.

➜  cat test.csv
call_096,001,반갑습니다 OO은행 OOO입니다
call_097,002,더 문의하실 점은 없습니까
call_098,003,감사합니다OOO였습니다좋은 하루 되세요

위와 같은 CSV 형식의 데이터를 아래와 같이 JSON 포맷으로 변환하는 순서는 아래와 같다.

  1. jq -Rn 옵션으로 JSON으로 파싱하지 않는다.
  2. [inputs | select(.) / ","] 전체 입력을 선택하고 딜리미터는 ,로 설정한다.
  3. 구분된 데이터를 파이프로 reduce로 전달한다.
➜  jq -Rn '[inputs | select( . != "" ) / ","] | reduce .[] as [$docid, $labels, $contents] ( []; . += [{$docid, $labels, $contents}] )' test.csv

[
  {
    "docid": "call_096",
    "labels": "001",
    "contents": "반갑습니다 OO은행 OOO입니다\r"
  },
  {
    "docid": "call_097",
    "labels": "002",
    "contents": "더 문의하실 점은 없습니까\r"
  },
  {
    "docid": "call_098",
    "labels": "003",
    "contents": "감사합니다OOO였습니다좋은 하루 되세요\r"
  }
]

아래와 같이 reduce (inputs) as [] 형식으로도 사용 가능하며 특정 항목을 리스트로 구성하는 방식도 가능하다.

➜  scripts jq -Rn 'reduce (inputs | select(.) / ",") as [$docid, $labels, $content] ({}; .[$docid] += [{$labels, $content}])' test.csv

{
  "call_096": [
    {
      "labels": "001",
      "content": "반갑습니다 OO은행 OOO입니다\r"
    }
  ],
  "call_097": [
    {
      "labels": "002",
      "content": "더 문의하실 점은 없습니까\r"
    }
  ],
  "call_098": [
    {
      "labels": "003",
      "content": "감사합니다OOO였습니다좋은 하루 되세요\r"
    }
  ]
}

아래 참고 페이지들 한번씩 읽어두자 ..

참고