CSV와 JSON 사이 — 쉼표·따옴표·줄바꿈이 걸리는 자리
CSV는 쉼표로 나눈 표입니다. 규칙이 한 줄로 끝날 것 같지만, 값 안에 쉼표가 있으면 어떻게 하나부터 복잡해집니다. 엑셀에서 한글이 깨지는 것도, 전화번호 앞자리 0이 사라지는 것도 전부 이 지점에서 나옵니다.
CSV 파일은 그냥 텍스트입니다. 첫 줄이 열 이름이고 그 아래로 한 줄에 한 행씩 들어갑니다. 프로그램마다 다르게 저장할 여지를 줄이려고 RFC 4180이라는 문서가 규칙을 정해 뒀고, 이 도구는 그 규칙을 따릅니다.
어려운 부분은 구분자가 값 안에 들어갔을 때입니다. 주소에 쉼표가 있고, 메모에 줄바꿈이 있고, 인용문에 따옴표가 있습니다. 이걸 어떻게 표시하느냐가 CSV의 거의 전부입니다.
값 안에 이것이 있으면 이렇게 씁니다
따옴표로 감싸는 것이 기본 도구이고, 따옴표 자체는 두 번 써서 표시합니다.
| 값에 들어 있는 것 | CSV에 쓰는 법 | 예 |
|---|---|---|
| 쉼표 | 칸 전체를 따옴표로 감쌈 | 부산시, 해운대구 → "부산시, 해운대구" |
| 줄바꿈 | 감싸면 줄바꿈도 값의 일부 | "서울시 강남구⏎테헤란로 1길" |
| 따옴표 | 따옴표를 두 번 쓰고 감쌈 | 그는 "안녕" → "그는 ""안녕""" |
| 앞뒤 공백 | 감싸면 공백이 보존됨 | " 값 " |
| 아무것도 없음 | 그냥 씀 | 홍길동 |
줄바꿈이 든 칸에서 대부분의 도구가 무너집니다
CSV를 읽는 흔한 방법은 줄 단위로 자른 다음 각 줄을 쉼표로 나누는 것입니다. 빠르고 간단하지만, 값 안에 줄바꿈이 있는 순간 틀립니다. 이 도구도 그렇게 되어 있었고, 다음 입력에서 3열 2행이 3행으로 늘어나면서 주소가 반으로 잘리고 메모가 사라졌습니다.
따옴표는 텍스트 전체를 훑으면서 추적해야 합니다. 따옴표 안의 줄바꿈은 데이터이고 밖의 줄바꿈은 행의 끝인데, 이 둘을 구별할 방법이 그것밖에 없기 때문입니다. 지금은 따옴표 상태를 들고 한 글자씩 읽습니다.
값에 줄바꿈이 들어가는 건 특이한 경우가 아닙니다. 스프레드시트에서 칸 안에 Alt+Enter로 줄을 바꾸면 그대로 저장됩니다. 주소, 메모, 배송 요청사항 같은 칸에서 흔히 생깁니다.
엑셀에서 한글이 깨지는 이유
JSON을 CSV로 바꿔서 엑셀로 열면 '이름'이 「씠由」처럼 나오는 일이 있습니다. 파일이 잘못된 게 아니라 엑셀이 잘못 읽은 것입니다.
글자를 파일에 저장하는 방식이 하나가 아닙니다. 요즘 웹은 UTF-8을 쓰고 '이름'은 EC 9D B4 EB A6 84 여섯 바이트가 됩니다. 그런데 한국어 윈도우의 엑셀은 CSV를 열 때 UTF-8이 아니라 CP949라는 옛 방식으로 읽으려 합니다. 같은 바이트를 다른 규칙으로 해석하니 엉뚱한 글자가 나옵니다.
해결책은 파일 맨 앞에 EF BB BF 세 바이트를 붙이는 것입니다. BOM이라고 하고, '이 파일은 UTF-8입니다'라는 표시입니다. 화면에는 보이지 않고 엑셀은 이걸 보면 제대로 읽습니다. 이 도구의 '엑셀에서 열리게 만들기'가 그 세 바이트를 붙이는 기능입니다.
반대로 엑셀에서 저장할 때는 '다른 이름으로 저장'에서 그냥 CSV가 아니라 **CSV UTF-8**을 고르면 엑셀이 BOM을 붙여 줍니다.
007과 010-1234가 사라지지 않게
CSV에는 타입이 없습니다. 전부 글자입니다. 그래서 JSON으로 바꿀 때 1234를 숫자로 볼지 글자로 볼지 정해야 합니다.
이 도구는 기본적으로 숫자로 바꾸되 0으로 시작하는 값은 건드리지 않습니다. 007을 7로 만들면 사원번호가 망가지고, 전화번호 010-1234는 애초에 숫자가 아닙니다. 앞자리 0은 '이건 수량이 아니라 식별자'라는 신호로 보는 편이 안전합니다.
표에서 계산을 할 게 아니라면 '숫자와 true/false를 값으로 바꾸기'를 꺼도 됩니다. 그러면 전부 문자열로 나오고 원본이 그대로 보존됩니다.
말없이 데이터가 사라지는 자리들
이 도구는 아래 상황에서 조용히 넘어가지 않고 무엇을 바꿨는지 화면에 적습니다.
- •같은 이름의 열이 두 번 — 뒤엣것이 앞엣것을 덮어써서 한 열이 통째로 사라집니다. 뒤쪽 이름 뒤에 _2를 붙입니다.
- •이름이 없는 열 — 키가 빈 문자열이 되어 다루기 어려워집니다. 열2 같은 이름을 붙입니다.
- •행마다 칸 수가 다름 — 모자란 칸은 빈 값으로 두고 몇 개 행이 그런지 알려 줍니다.
- •파일 앞의 BOM — 첫 열 이름이 눈에 안 보이는 글자로 시작해서 '이름'과 영영 일치하지 않게 됩니다. 떼어냅니다.
- •닫히지 않은 따옴표 — 그 뒤 내용이 전부 한 칸에 들어갑니다.
- •JSON의 중첩 객체 — 표에는 칸 안에 표를 넣을 수 없습니다. [object Object] 대신 JSON 문자열로 넣습니다.
자주 묻는 질문
구분자가 쉼표가 아니라 세미콜론입니다.
유럽 지역 설정에서는 소수점에 쉼표를 쓰기 때문에 엑셀이 세미콜론으로 저장합니다. 구분자에서 '직접 입력'을 고르고 세미콜론을 넣으면 됩니다. 탭으로 나뉜 파일(TSV)도 마찬가지입니다.
엑셀에서 복사해서 붙여넣었더니 쉼표가 아니라 탭입니다.
스프레드시트에서 셀 범위를 복사하면 탭으로 구분됩니다. 구분자를 Tab으로 바꾸면 그대로 변환됩니다.
JSON이 배열이 아니라 객체 하나입니다.
그대로 넣으셔도 됩니다. 한 줄짜리 표로 바꾸고 그렇게 했다고 알려 드립니다.
파일이 저장되거나 전송되나요?
아니요. 변환은 브라우저 안에서만 일어나고 붙여넣은 내용은 어디로도 나가지 않습니다.
