본문 바로가기

CSV JSON 변환

CSV 파일이나 붙여 넣은 표를 깔끔한 JSON으로 바꿉니다. 숫자와 불리언은 타입을 지정하고, 점으로 구분된 머리글로 중첩 객체를 만들어, 코드가 기대하는 모양 그대로 만들어 드립니다.

  • 저장되지 않음
  • 대기열 없음, 기다림 없음
  • 회원가입 없음, 워터마크 없음

사용 방법

1

CSV 추가

.csv나 .tsv 파일을 끌어다 놓거나 데이터를 붙여 넣으세요. 구분 기호와 인코딩은 자동으로 감지됩니다.

2

모양 선택

객체 배열, 배열의 배열, 첫 번째 열을 키로 한 객체, JSON Lines 중에서 고르고, 타입, 빈 값, 들여쓰기도 설정합니다.

3

복사 또는 다운로드

JSON을 클립보드에 복사하거나 .json 파일로 저장하세요.

CSV가 보기보다 모호한 부분

CSV에는 제대로 된 표준이 없습니다. 대부분의 도구가 하는 방식을 설명한 2005년의 권고 사양이 있고, 그와 다르게 동작하는 소프트웨어가 아주 많습니다. 그래서 첫 번째 일은 파일이 실제로 어떤 것인지 알아내는 것입니다. 값이 쉼표, 세미콜론, 탭 중 무엇으로 구분되는지(유럽 로캘은 세미콜론으로 내보냅니다. 쉼표가 소수점 기호이기 때문입니다), 첫 행이 머리글인지, 따옴표를 어떻게 처리하는지 확인합니다. 따옴표로 감싼 필드에는 쉼표, 줄바꿈, 두 번 겹친 따옴표가 합법적으로 들어갈 수 있습니다. 그래서 쉼표로 나누는 것은 CSV를 읽는 잘못된 방법이며, 단순한 파서는 주소가 든 파일이라면 무엇이든 망가뜨립니다.

두 번째 일은 타입이며, JSON에는 CSV에 없는 구분이 있습니다. CSV 셀에는 텍스트만 들어 있지만, JSON은 숫자, 문자열, 불리언, null을 구분합니다. 누군가는 무엇이 무엇인지 정해야 하고, 중요한 것은 잘못되기 쉬운 결정들입니다. 우편번호, 전화번호, 계좌 번호에서 앞자리 0은 의미가 있으므로, 01234 같은 값은 숫자 1234가 아니라 문자열로 남아야 합니다. 긴 식별자도 마찬가지로, 약 9천조를 넘으면 JSON 숫자로는 정밀도를 잃습니다.

JSON에는 날짜 타입이 없으므로 날짜는 원래 텍스트 그대로 남습니다. 2024-03-05는 문자열 "2024-03-05"로 나오며, 이는 한계가 아니라 정직한 답입니다. 그 대안은 추측이고, 03/05/2024가 어떤 나라에서는 3월이 되고 다른 나라에서는 5월이 되는 것이 바로 추측 때문입니다. 날짜 변환은 원하는 형식을 아는 쪽, 즉 JSON을 받아 쓰는 쪽이 정할 일입니다.

마지막으로 조용히 실패하는 부분은 인코딩입니다. CSV에는 문자 인코딩 정보가 없으므로, Windows-1252로 저장된 파일을 UTF-8로 읽으면 정확히 악센트가 있는 이름이 든 행에서 글자가 깨집니다. 또 Excel이 파일 앞에 붙이는 바이트 순서 표시(BOM)를 처리하지 않으면 첫 번째 필드 이름에 이상한 문자로 나타납니다. 둘 다 특정 변환기가 아니라 CSV라는 형식의 특성입니다.

다른 작업이 필요할 때

메모리에 담기에 너무 큰 파일이나 스크립트로 처리하는 작업이라면 csvkit 이 딱 맞게 만들어져 있습니다. csvjson --stream data.csv 는 점진적으로 변환하고, csvlook 은 먼저 무엇이 들어 있는지 보여 주며, csvclean 은 이후 단계를 모두 망가뜨리는 들쭉날쭉한 행을 고칩니다. Miller 의 mlr --icsv --ojson cat data.csv 는 같은 일을 상당히 빠르게 하며, 대부분의 데이터 파이프라인이 실제로 원하는 줄 단위 JSON도 처리합니다.

편의보다 타입이 중요할 때는 타입을 추론하지 말고 선언한 코드로 변환하세요. Python pandas 에 명시적인 dtype 매핑을 주거나 스키마가 있는 짧은 스크립트를 쓰면, 우편번호는 우편번호로 남고 식별자는 모든 자릿수를 유지합니다. 전체를 보지 못한 파일에 대해서는 어떤 자동 추론도 이를 보장할 수 없습니다.

자주 묻는 질문

어떤 JSON 모양을 골라야 하나요?

[{"name": "Ada", "age": 36}] 같은 객체 배열은 거의 모든 API와 라이브러리에 맞습니다. 배열의 배열은 가장 간결합니다. 키 기반 객체는 코드에서 ID로 레코드를 찾을 수 있게 해 줍니다. JSON Lines는 한 줄에 레코드 하나씩 담아 스트리밍 도구, BigQuery, 로그 파이프라인에 쓰입니다.

숫자와 불리언은 어떻게 정해지나요?

열마다 한 번 정합니다. 열의 모든 값이 숫자일 때만 숫자 열이 되므로 "007"과 7이 한 키 아래 섞이는 일은 없습니다. 앞자리 0이 있는 값과 JavaScript가 정확히 담을 수 없을 만큼 긴 ID는 문자열로 남습니다. true와 false는 불리언이 되고, 빈 셀은 null이 되거나, 원하면 빈 문자열이 되거나 아예 빠집니다.

중첩 JSON을 만들 수 있나요?

네. 중첩을 켜면 address.city 같은 머리글이 {"address": {"city": …}}가 되고, tags.0, tags.1은 배열이 됩니다.

제 데이터가 어딘가에 저장되나요?

아니요. 어디에도 전송되지 않고 아무것도 저장하지 않습니다.

세미콜론, 탭, 다른 인코딩은 어떻게 되나요?

쉼표, 세미콜론, 탭, 파이프는 자동으로 감지되며, UTF-8, UTF-16, 예전 Windows 인코딩도 마찬가지라 악센트 문자와 라틴 문자가 아닌 텍스트도 온전히 나옵니다.

열 이름이 중복되거나 비어 있으면요?

중복된 이름에는 번호가 붙고(name, name_2), 빈 머리글에는 위치에 따른 이름(column_3)이 붙어 어떤 값도 덮어쓰이지 않으며, 무엇이 바뀌었는지 알려 드립니다.

참고: JSON에는 날짜 타입이 없으므로 날짜는 파일에 있던 텍스트 그대로 남습니다. 아주 큰 파일은 브라우저 메모리에 따라 제한됩니다.

내 웹사이트에 이 도구 넣기

블로그, 수업 페이지, 도움말 글 어디에나 무료로 넣을 수 있습니다. 코드 한 줄만 붙여 넣으면 방문자가 페이지에서 바로 사용할 수 있습니다.