CSV / JSON 변환
CSV에서 JSON으로, JSON에서 CSV로. 구분자 자동 감지, 헤더 처리, 무손실 형 변환 지원.
결과가 여기에 표시됩니다
이 도구가 하는 일
CSV는 스프레드시트, 데이터베이스 내보내기, 분석 대시보드가 건네는 것이고, JSON은 API와 코드가 원하는 것입니다. 이 도구는 그 둘을 양방향으로, 브라우저 안에서 변환합니다. CSV를 붙여넣으면 JSON 배열이 나옵니다 — 헤더 행으로 키가 매겨진 객체, 또는 데이터에 헤더가 없으면 맨 배열입니다. 방향을 바꾸면 JSON 배열이 CSV가 되고, 각 값이 필요한 만큼만 정확히 따옴표로 감싸입니다.
작업은 사용자의 기기에서 이루어지며, CSV가 사람이 고객 목록, 청구서, 분석 추출본을 내보내는 형식이라는 점에서 그것이 중요합니다. 그중 아무것도 어디로도 업로드되지 않습니다.
쉼표로 나누는 것만으로 부족한 이유
CSV를 읽는 뻔한 방법 — 각 줄을 쉼표로 나누는 것 — 은 실제 파일에서 깨집니다. 형식에 이스케이프 장치가 있기 때문입니다. 큰따옴표로 감싼 필드는 구분자, 두 개 연속으로 쓴 문자 그대로의 따옴표, 심지어 줄바꿈까지 담을 수 있고, 그 경우 한 레코드가 파일의 여러 줄에 걸칩니다. 이 도구는 실제 규칙(RFC 4180)을 한 글자씩 파서로 구현하므로 세 경우 모두 온전히 통과합니다.
name,note Grace,"rear admiral, USN" Ada,"she said ""hello""" Alan,"two lines"
이 네 레코드는 여분의 쉼표, 따옴표, 줄바꿈이 있어도 저마다 필드가 둘입니다. 따옴표가 잘못되면 — 필드가 따옴표를 열고 결코 닫지 않으면 — 조용히 망가진 표가 아니라 폭주한 따옴표가 시작된 줄과 열이 나옵니다.
구분자는 흔히 쉼표가 아니다
이름과 달리 쉼표로 구분된 값은 흔히 그렇지 않습니다. 쉼표가 소수점인 로캘 — 유럽 대륙 대부분 — 에서는 1,50이 거기서 숫자라 Excel이 대신 세미콜론으로 내보냅니다. 데이터베이스와 명령줄 도구는 흔히 탭으로 구분된 데이터를 내고, 로그 파이프라인은 파이프를 좋아합니다. 그중 하나를 쉼표 전용 도구에 붙여넣으면 아주 넓은 한 열이 나오는데, 가장 흔한 CSV의 짜증입니다.
그래서 구분자는 가정하지 않고 감지합니다. 각 후보를 시도하고, 승자는 모든 행에서 같은 열 수를 내는 것 — 가장 많은 수가 아니라 일관성입니다. 소수점 쉼표투성이인 파일이 그렇지 않으면 쉼표 구분으로 보이기 때문입니다. 감지한 구분자는 늘 표시되고, 추측이 틀리면 덮어쓸 수 있습니다.
헤더와 출력의 모양
"첫 행은 헤더"를 켜면 그 행이 키 이름을 공급하고 출력은 객체 배열 — 거의 모든 API가 기대하는 모양 — 이 됩니다. 끄면 각 행이 값의 배열이 되고, 이는 곧바로 데이터로 시작하는 파일에 원하는 것입니다.
- 헤더보다 필드가 적은 행은 undefined 값의 키가 아니라 빠진 열에 빈 문자열을 얻습니다.
- 중복된 헤더 이름은 서로 덮어쓰지(이는 조용히 열을 떨어뜨립니다) 않고 고유하게 됩니다(id, id_2, id_3).
- 빈 헤더 셀은 column_2, column_3 등이 되므로 어느 키도 빈 문자열이 아닙니다.
- 빈 줄은 스프레드시트 가져오기가 그러듯 건너뜁니다 — 붙여넣은 파일은 흔히 떠도는 줄바꿈으로 끝나고, 거기 빈 값의 행이 있으면 버그처럼 보입니다.
데이터를 잃을 수 없는 형 변환
CSV의 필드는 모두 텍스트입니다. 숫자처럼 보이는 텍스트를 JSON 숫자로 바꾸는 것은 대개 원하는 바지만 — 데이터가 조용히 망가지는 길이기도 합니다. 우편번호 01234가 1234가 됩니다. 20자리 주문 번호가 반올림된 부동소수점이 됩니다. 1.50으로 쓴 가격이 끝의 0을 잃습니다.
여기서 쓰는 규칙은 특별한 경우 목록 없이 그 모두를 피합니다: 값이 숫자가 되는 것은 텍스트로 되돌렸을 때 원본을 정확히 재현할 때뿐입니다. 42는 그러므로 변환됩니다. 01234는 그렇지 않으므로 문자열로 남습니다. 1.50, +5, 1e5, 또는 배정밀도가 정밀도를 잃는 지점을 넘은 정수도 마찬가지입니다. 문자열 true와 false는 불리언이 됩니다. 빈 필드는 null이 아니라 빈 문자열로 남습니다. CSV는 "값 없음"과 "빈 값"의 차이를 나타낼 수 없고, 하나를 지어내는 것은 정보를 지어내는 것이기 때문입니다.
CSV로 되돌리기
반대 방향에서는 객체 배열이, 모든 키의 합집합을 처음 나타난 순서로 열로 삼는 표가 됩니다 — 그래서 다른 키를 가진 행도 정렬되고, 빠진 키는 빈 셀을 냅니다. 배열의 배열은 행마다 쓰입니다. 따옴표는 형식이 요구하는 곳에만 적용됩니다: 구분자, 따옴표, 줄바꿈을 담은 값이 감싸이고 안쪽 따옴표가 두 겹이 됩니다.
CSV로 나타낼 방도가 없는 값 — 중첩된 객체나 배열 — 은 평평하게 하거나 떨구지 않고 그 셀 안에 JSON으로 쓰이므로, 변환에서 아무것도 사라지지 않습니다. null은 빈 셀이 됩니다.
자주 묻는 질문
- 제 파일이 하나의 거대한 열로 나온 이유는 무엇인가요?
- 도구가 쓴 구분자가 다른 것입니다. 대개는 세미콜론 파일(쉼표가 소수점인 유럽 로캘에서 Excel의 표준)이나 탭으로 구분된 내보내기를 뜻합니다. 감지가 보통 이것을 잡습니다 — 어느 구분자가 표시되는지 확인하고, 추측이 틀렸으면 드롭다운에서 다른 것을 고르세요.
- 제 ID가 JSON에서 여전히 문자열인 이유는 무엇인가요?
- 변환하면 그것을 바꾸기 때문입니다. 숫자는 변환이 정확히 되돌릴 수 있을 때만 변환되므로, 01234는 앞의 0을 지키고 긴 ID는 모든 자릿수를 지킵니다. 정말 숫자로 원한다면 데이터를 앞의 0 없이 쓰거나, 정밀도를 직접 제어하는 곳에서 나중에 변환하세요.
- 필드 안의 쉼표와 따옴표는 어떻게 되나요?
- 유지됩니다. 들어올 때 따옴표 붙은 필드는 쉼표, 두 겹으로 한 따옴표, 심지어 줄바꿈을 담을 수 있습니다. 나갈 때 구분자, 따옴표, 줄바꿈을 담은 값은 따옴표로 감싸이고 안쪽 따옴표가 두 겹이 됩니다. 값은 CSV → JSON → CSV를 바뀌지 않고 왕복합니다.
- 제 데이터가 어딘가로 업로드되나요?
- 아니요. 파싱도 변환도 전적으로 브라우저 안에서 도므로, 보통 CSV에 담기는 고객 목록, 내보내기, 보고서가 기기 밖으로 나가지 않습니다.