본문으로 건너뛰기
jsonbeautifiers
한국어

CSV를 JSON으로

구분자 자동 감지, 따옴표로 감싼 필드, 우편번호를 망치지 않는 타입 추론.

CSV
JSON

붙여 넣은 것은 여러분의 브라우저를 떠나지 않습니다. connect-src 허용 목록 덕분에 이는 약속이 아니라 브라우저가 강제하는 보장입니다. 직접 확인하기

CSV를 헤더 행을 키로 삼는 JSON 객체 배열로 변환합니다. 구분자는 자동으로 감지하고, 쉼표와 줄바꿈이 들어간 따옴표 필드도 처리하며, 중복된 열 이름은 버리지 않고 이름을 바꿉니다.

타입 추론은 기본적으로 꺼져 있고, 그건 의도한 설정입니다.

왜 지시하기 전까지 모든 값이 문자열인가

CSV 변환기가 데이터를 망가뜨리는 지점이 타입 추론입니다. CSV에는 타입이 없으니 변환기는 추측할 수밖에 없고, 그 추측은 알아채기 어려운 방식으로 틀립니다.

007은 7이 되고 우편번호는 사라집니다. 1234567890123456789로 적힌 전화번호는 JavaScript 숫자가 담을 수 있는 범위를 넘어 다른 값으로 돌아옵니다. 1E5 같은 제품 코드는 100000이 됩니다. NA라는 값은 어떤 행에서는 문자열이 되고 다른 곳에서는 열의 헤더가 됩니다.

그래서 기본값이 문자열입니다. 데이터를 잘 알 때 추론을 켜세요. 그리고 켜더라도 앞자리 0은 그대로 남고, float64 왕복을 견디지 못할 값은 문자열로 남습니다.

다들 걸려 넘어지는 CSV 규칙

따옴표
RFC 4180입니다. 쉼표, 따옴표, 줄바꿈이 든 필드는 큰따옴표로 감싸고, 안쪽 따옴표는 두 개로 씁니다. 이 파서는 여러 줄 필드까지 포함해 그것을 정확히 읽습니다.
구분자
쉼표, 세미콜론, 탭, 파이프를 앞 몇 줄에서 따옴표 바깥의 출현 횟수를 세어 자동으로 감지합니다. 유럽식 엑셀은 세미콜론으로 씁니다.
중복 헤더
JSON 객체는 중복 키를 담을 수 없으므로 반복된 열 이름에는 접미사를 붙이고 그 변경을 알려 줍니다. 하나를 버리는 건 조용한 데이터 손실입니다.
길이가 들쭉날쭉한 행
헤더보다 필드가 적은 행에는 null을 넣고, 많은 행은 남는 값을 _extra 키 아래에 둡니다. 둘 다 조용히 맞추지 않고 줄 번호와 함께 보고합니다.
바이트 순서 표식
떼어 내고 보고합니다. 그대로 두면 첫 열 이름의 일부가 되어, 필드가 영문 모를 이유로 사라진 것처럼 보입니다.

중첩 구조 되살리기

헤더가 점으로 이어진 경로라면, 예컨대 저희 변환기가 만든 CSV라면 "점 헤더 펼치기"를 켜세요. 중첩이 복원되어 address.city가 점이 든 키가 아니라 중첩된 객체가 됩니다.

How to do this in code

코드에서의 변환.

py Python

utf-8-sig가 BOM을 떼어 냅니다. dtype=str은 pandas가 007을 7로 바꾸지 못하게 하는 방법입니다.

import csv, json

# The standard library gives you strings, which is the honest default
with open('in.csv', newline='', encoding='utf-8-sig') as f:
    rows = list(csv.DictReader(f))
print(json.dumps(rows, indent=2))

# pandas infers types, which is convenient and lossy
import pandas as pd
df = pd.read_csv('in.csv', dtype=str)   # dtype=str turns inference OFF
records = df.to_dict(orient='records')
js JavaScript
import Papa from 'papaparse';

const { data, errors } = Papa.parse(csv, {
  header: true,
  skipEmptyLines: true,
  dynamicTyping: false,   // leave it off; see the note above
});
sh Shell
# csvkit
in2csv data.csv | csvjson --indent 2 > data.json

# Or with Miller, which is a single binary
mlr --icsv --ojson cat data.csv

자주 묻는 질문

타입 추론을 켜야 하나요?
데이터를 알고 있을 때만요. 추론은 대개 맞고, 예외는 하필 잃어서는 안 되는 값들입니다. 우편번호, 계좌번호, 부품번호, 전화번호, 앞자리에 0이 붙는 모든 것. 추론을 켜 두어도 이 도구는 그런 값들은 건드리지 않습니다.
첫 열 이름이 이상한 이유는?
바이트 순서 표식입니다. 이 도구는 그것을 떼어 내고 그렇게 했다고 알려 줍니다. 그러지 않는 파서는 이름 맨 앞에 보이지 않는 문자를 남기고, 그 이름으로 하는 조회가 이유도 없이 실패합니다.
배열 대신 NDJSON으로 뽑을 수 있나요?
여기서 변환한 다음 NDJSON 페이지를 쓰세요. 배열을 한 줄에 한 레코드로 바꿔 줍니다. 스트리밍하거나 계속 덧붙일 계획이라면 그쪽이 더 나은 형식입니다.