CSV와 JSON은 무엇이 다른가요?
CSV(Comma-Separated Values)는 "한 줄이 한 행, 쉼표가 열 경계"라는 단순한 약속으로 표를 글자만으로 표현하는 형식입니다. 열의 이름은 보통 첫 줄에만 적고, 모든 값은 원칙적으로 글자(텍스트)입니다. 반면 JSON은 키와 값의 쌍으로 데이터를 적고, 값이 문자열인지 숫자인지 true/false인지, 심지어 또 다른 객체나 배열인지까지 구분해서 적는 형식입니다. 그래서 엑셀·구글 시트·회계 프로그램이 내려받는 표는 대부분 CSV이고, 웹 API·설정 파일·프로그램 사이의 데이터 교환은 대부분 JSON입니다. 이 도구는 두 세계를 오가는 다리 역할을 합니다.
변환의 핵심 규칙은 하나입니다. CSV의 첫 줄을 키(key)로 삼고, 그 아래 각 줄을 하나의 객체로 만들어 배열에 담습니다. 아래는 가장 단순한 예입니다.
이름,나이,직급
홍길동,32,과장
김민준,28,대리이 데이터는 다음 JSON 배열이 됩니다(나이는 숫자로 인식됩니다).
[
{
"이름": "홍길동",
"나이": 32,
"직급": "과장"
},
{
"이름": "김민준",
"나이": 28,
"직급": "대리"
}
]쉼표가 들어 있는 셀과 줄바꿈이 들어 있는 셀
CSV에서 가장 흔한 사고는 "값 안에 쉼표가 있는 경우"입니다. 주소 "서울시 강남구, 역삼동"을 그냥 적으면 쉼표 때문에 두 칸으로 쪼개집니다. 이를 막는 표준 규칙(RFC 4180)은 다음과 같습니다.
- 쉼표·큰따옴표·줄바꿈이 들어간 값은 전체를 큰따옴표(")로 감쌉니다.
- 감싼 값 안에 큰따옴표가 들어가면 큰따옴표를 두 번("") 적어 "이 글자는 데이터"라고 표시합니다.
- 감싸진 값 안의 줄바꿈은 행의 끝이 아니라 데이터의 일부입니다. 엑셀에서 Alt+Enter로 만든 셀 내 줄바꿈이 이 경우입니다.
이 변환기는 위 규칙을 그대로 구현했습니다. 다음 CSV는 3개 열, 1개 데이터 행으로 정확히 읽힙니다.
상품,설명,가격
"볼펜, 검정","굵기 0.7mm
""고급형""",1200[
{
"상품": "볼펜, 검정",
"설명": "굵기 0.7mm\n\"고급형\"",
"가격": 1200
}
]단순히 줄 단위로 쪼개고 쉼표로 자르는 간이 변환기는 이 입력에서 열 개수가 어긋나는 결과를 내놓습니다. 변환 결과 위에 표시되는 "열 개수가 다른 행" 경고는 바로 이런 문제를 알아차리게 하려는 장치입니다. 데이터 행의 칸 수가 헤더와 다르면 몇 번째 줄인지 알려 주고, 모자란 칸은 빈 문자열로 채우며 남는 칸은 버립니다.
숫자·불리언 자동 인식은 어떻게 판단하나요?
"숫자·true/false 자동 인식"을 켜면 각 셀을 아래 규칙으로 판정합니다. 자바스크립트의 느슨한 숫자 변환(Number)을 그대로 쓰면 "0x1F"가 31로, "1e3"이 1000으로, 빈 칸 비슷한 값이 0으로 바뀌는 등 의도치 않은 변환이 생기기 때문에, 이 도구는 더 엄격한 규칙을 씁니다. 아래 표는 규칙을 실제 함수에 넣어 계산한 결과입니다.
| 셀 원문 | JSON 출력 | 판정 |
|---|---|---|
| 32 | 32 | 숫자 |
| -4.5 | -4.5 | 숫자 |
| 0.75 | 0.75 | 숫자 |
| 007 | "007" | 문자열 |
| 01012345678 | "01012345678" | 문자열 |
| 1e3 | "1e3" | 문자열 |
| 0x1F | "0x1F" | 문자열 |
| 12345678901234567890 | "12345678901234567890" | 문자열 |
| true | true | 불리언 |
| TRUE | "TRUE" | 문자열 |
| false | false | 불리언 |
| null | "null" | 문자열 |
| 1,200 | "1,200" | 문자열 |
| 3.14.15 | "3.14.15" | 문자열 |
요약하면 "-12", "3.5"처럼 앞에 불필요한 0이 없고 소수점이 하나뿐인 십진수만 숫자가 됩니다. 앞자리 0이 있는 "007"과 전화번호 "01012345678", 15자리를 넘어 정밀도가 깨질 수 있는 긴 숫자, 천 단위 쉼표가 있는 "1,200"은 모두 문자열로 남습니다. true/false는 소문자 그대로일 때만 불리언이 되며, "TRUE"나 "null"은 문자열입니다. 전부 문자열로 받고 싶다면 체크를 해제하세요.
엑셀·구글 시트 데이터를 바로 붙여넣는 방법
엑셀이나 구글 시트에서 셀 범위를 복사하면 열 사이가 탭 문자로 구분된 텍스트가 클립보드에 담깁니다(TSV). 첫 입력창에 그대로 붙여넣으면 "자동 감지"가 첫 줄을 훑어 탭, 쉼표, 세미콜론 중 가장 많이 나오는 문자를 구분자로 고릅니다. 이때 따옴표 안에 든 쉼표는 세지 않습니다. 유럽식 설정의 엑셀은 쉼표가 소수점으로 쓰여서 CSV 구분자로 세미콜론을 쓰는 경우가 많은데, 이것도 자동 감지로 처리됩니다. 첫 줄이 한 칸짜리 헤더여서 구분자 후보가 하나도 없다면 쉼표로 간주하므로, 그 경우에는 구분자를 직접 지정하세요.
반대로 JSON을 엑셀에 옮길 때는 "출력 구분자"를 탭으로 바꿔 변환하고 결과를 복사해 셀에 붙여넣으면 열이 알아서 나뉩니다. 파일로 저장하려면 "엑셀용 CSV 파일 저장"을 쓰세요. 이 버튼은 파일 맨 앞에 UTF-8 BOM(바이트 순서 표시)을 붙입니다. BOM이 없으면 한국어 윈도우의 엑셀이 UTF-8 CSV를 CP949로 잘못 해석해 한글이 깨져 보이는 일이 흔합니다.
JSON → CSV에서 알아둘 점
- 헤더는 모든 객체의 키를 합쳐서 만듭니다. 처음 등장한 순서를 유지하며, 어떤 객체에 없는 키는 빈 칸이 됩니다.
- 중첩된 객체·배열은 한 셀 안의 JSON 문자열이 됩니다. 표는 2차원이라 계층을 표현할 수 없기 때문입니다. 계층을 펼치고 싶다면 JSON을 먼저 평탄화해야 합니다.
- 객체 하나만 넣어도 됩니다. 배열이 아닌 단일 객체는 한 행짜리 표로 처리합니다.
- null은 빈 칸, true/false는 글자 그대로 true/false로 적습니다. 다시 CSV → JSON을 하면 빈 칸은 빈 문자열이 되므로 null이 복원되지는 않습니다.
- 객체가 아닌 요소(숫자, 문자열 등)가 섞여 있으면 그 줄은 빈 행으로 두고 개수를 알려 드립니다.
왕복 변환이 완전히 같지 않은 경우
CSV → JSON → CSV로 돌리면 대체로 원본과 같지만, 몇 가지는 달라질 수 있습니다. 숫자 "1.0"은 자동 인식으로 1이 되어 소수점 표기가 사라지고, 앞뒤 공백 제거를 켜 두면 " 홍길동 "의 공백이 없어지며, 빈 칸은 null이 아닌 빈 문자열로 남습니다. 값의 모양까지 그대로 보존해야 하는 작업(우편번호, 계좌번호, 사번 등)이라면 자동 인식을 끄고 변환하세요.
이 도구를 쓰기 전에 점검할 흔한 실수
- 헤더가 없는 CSV: 첫 줄을 무조건 키로 쓰므로, 데이터 첫 줄이 키 이름으로 둔갑합니다. 먼저 헤더 줄을 추가하세요.
- 같은 이름의 헤더가 두 번 이상: JSON 객체는 같은 키를 둘 수 없습니다. 이 도구는 두 번째부터 "이름_2", "이름_3"으로 바꿔 데이터 손실을 막고, 상태 메시지로 알립니다. 빈 헤더는 "열3"처럼 번호 이름을 붙입니다.
- 엑셀에서 이미 앞자리 0이 사라진 경우: 엑셀이 "01012345678"을 숫자로 읽어 저장해 버렸다면 CSV에는 이미 "1012345678"로 들어 있습니다. 변환기 문제가 아니라 원본 문제이므로 엑셀에서 열 서식을 "텍스트"로 바꾼 뒤 다시 입력해야 합니다.
- 날짜 형식: 날짜는 JSON에 별도 타입이 없어 문자열로 남습니다. "2026-10-13"과 "10/13/2026" 같은 표기가 섞여 있다면 변환 전에 하나로 통일하는 편이 이후 처리에 안전합니다.
- 스프레드시트 수식 주입: 셀 값이 =, +, -, @로 시작하면 엑셀이 수식으로 해석할 수 있습니다. 외부에서 받은 데이터를 CSV로 만들어 엑셀로 열 때는 그런 셀이 없는지 확인하세요.
이 도구가 적합하지 않은 경우
수십 MB가 넘는 대용량 파일은 브라우저 메모리와 텍스트 영역 한계 때문에 느려지거나 멈출 수 있으므로 스크립트나 전용 도구가 낫습니다. 열마다 서로 다른 타입을 강제해야 하거나(예: 이 열만 날짜로), 계층 구조 JSON을 점 표기법으로 펼쳐야 하는 작업도 범위를 벗어납니다. 또한 이 변환기는 입력한 내용을 서버로 보내지 않고 브라우저 안에서만 처리하지만, 개인정보나 기밀 데이터를 공용 PC에서 다룰 때는 작업 후 입력창을 비우는 습관을 들이세요.
변환한 뒤 무엇을 하나요?
만들어진 JSON은 웹 API 테스트 도구에 요청 본문으로 넣거나, 프로그램의 목업 데이터로 쓰거나, 설정 파일에 넣을 수 있습니다. 문법이 맞는지 다시 확인하거나 보기 좋게 들여쓰려면 JSON 포맷터를, 설정 파일용 YAML이 필요하면 YAML ↔ JSON 변환기를 이어서 쓰면 됩니다. 엑셀 안에서 한 칸의 내용을 열로 나누는 방법은 엑셀 텍스트 나누기 가이드에, 텍스트 표를 줄 맞춰 보여 주는 용도는 텍스트 표 정렬기에 정리돼 있습니다. 변환 전후의 차이를 확인하고 싶다면 텍스트 비교 도구가 도움이 됩니다.
자주 묻는 질문
중첩된 객체나 배열이 있으면 어떻게 되나요?
CSV로 변환할 때 값이 객체나 배열이면 JSON 문자열 형태로 그대로 하나의 셀에 담습니다. 완전히 펼쳐진 표 형태가 필요하다면 별도의 스프레드시트 도구로 추가 가공하는 것이 더 정확합니다.
행마다 열(키) 구성이 다른 JSON도 CSV로 바꿀 수 있나요?
네. 모든 객체에 등장하는 키를 모아 하나의 헤더로 만들고, 특정 객체에 없는 키는 빈 칸으로 채워 표를 완성합니다.
따옴표로 감싼 셀 안에 쉼표나 줄바꿈이 있어도 되나요?
됩니다. 큰따옴표 안의 쉼표·탭·줄바꿈은 구분자나 행의 끝이 아니라 값의 일부로 읽습니다. 값 안의 큰따옴표는 두 번 겹쳐 적은 형태("")를 큰따옴표 한 개로 복원합니다. 따옴표가 닫히지 않은 채 끝나면 오류로 알려 드립니다.
전화번호나 우편번호의 앞자리 0이 사라져요.
"숫자·true/false 자동 인식"을 해제하세요. 다만 이 도구의 자동 인식은 "007", "01012345678"처럼 앞자리 0이 있는 값을 이미 문자열로 두므로 대부분 보존됩니다. 그래도 사라졌다면 엑셀에서 저장할 때 이미 지워진 것입니다.
엑셀로 CSV를 열면 한글이 깨집니다.
UTF-8 BOM이 없는 CSV를 한국어 윈도우 엑셀이 다른 인코딩으로 읽어서 생기는 현상입니다. "엑셀용 CSV 파일 저장" 버튼으로 받은 파일은 BOM이 붙어 있어 대개 정상적으로 열립니다. 복사해서 붙여넣는 방식이라면 구분자를 탭으로 바꿔 직접 셀에 붙여넣는 것이 가장 간단합니다.
데이터가 서버로 전송되나요?
아니요. 모든 변환은 열려 있는 브라우저 탭 안에서 자바스크립트로만 이뤄지며, 입력한 내용은 저장되지 않습니다.