CSV to JSON 변환 도구
CSV 파일을 업로드하거나 데이터를 붙여넣어 JSON 형식으로 변환
CSV 파일을 여기에 드롭하거나 클릭하여 선택
CSV to JSON이란?
CSV to JSON은 CSV(쉼표로 구분된 값) 데이터를 JSON(JavaScript 객체 표기법) 형식으로 변환하는 온라인 데이터 형식 변환 도구입니다.
CSV는 스프레드시트와 데이터베이스 내보내기에 널리 사용되는 일반적인 표 형식 데이터입니다. JSON은 명확한 구조와 쉬운 파싱으로 현대 웹 애플리케이션에서 가장 인기 있는 데이터 교환 형식입니다.
이 도구를 사용하면 CSV 데이터를 빠르게 JSON 배열이나 객체로 변환하여 프로그래밍과 데이터 처리에 편리하게 사용할 수 있습니다.
사용 방법
사용 방법
- 왼쪽 입력 패널에 CSV 데이터를 붙여넣거나 입력하세요
- 적절한 구분자를 선택하세요 (기본값: 쉼표)
- 첫 번째 행을 필드명으로 사용할지 선택하세요
- 오른쪽 패널에 JSON 결과가 자동으로 생성됩니다
CSV 파싱 참고사항
- JSON 결과를 신뢰하기 전에 구분자, 따옴표 처리, 헤더 행 설정을 확인하세요.
- 대용량 CSV 파일에는 빈 행, 셀 내부의 쉼표, 따옴표로 묶인 셀의 줄 바꿈이 있을 수 있습니다. 변환 후 몇 줄을 미리 확인하세요.
활용 사례
기술 원리
CSV 파싱은 IETF RFC 4180 문법을 따릅니다: 각 레코드는 CRLF로 종료되고(일부 방언은 LF 또는 CR 허용), 각 레코드는 구분자(RFC에서는 쉼표이지만 TSV, 세미콜론, 파이프가 널리 사용되는 변형)로 구분된 필드를 포함하며, 구분자, CR, LF, 큰따옴표가 포함된 필드는 반드시 큰따옴표로 감싸야 하며 내부 큰따옴표는 이중으로 이스케이프합니다(Hello "world"는 "Hello ""world"""가 됩니다). 이 페이지의 파서는 4개 상태(field_start, in_unquoted, in_quoted, after_quote)를 가진 상태 머신으로, 문자 스트림에 대해 단일 O(n) 패스로 입력을 처리하므로, 100,000행의 10MB CSV가 일반 노트북에서 1초 이내에 완료되고 행당 중간 토큰 배열을 할당하지 않습니다. 인코딩에는 명시적 처리가 필요합니다: 파일 시작 부분의 UTF-8 BOM(EF BB BF)은 파싱 전에 제거됩니다. 그렇지 않으면 첫 번째 헤더 이름이 보이지 않는 U+FEFF 코드 포인트로 시작하게 되어 다운스트림 JSON.parse 동등성 검사가 실패합니다. Windows의 Excel 내보내기는 여전히 CRLF와 UTF-8 BOM을 출력하는 반면, macOS Numbers와 대부분의 Unix 도구는 BOM 없이 LF를 기본값으로 사용합니다. 유럽 스프레드시트는 쉼표가 많은 로케일에서 소수점 구분자(49.90이 아닌 49,90 EUR)이므로 세미콜론 구분 파일을 흔히 내보내며, 이것이 구분자 선택기가 쉼표를 기본값으로 하되 탭, 세미콜론, 파이프를 1급 선택지로 노출하는 이유입니다. 첫 번째 행을 헤더로 사용하는 토글은 출력 형태를 객체 배열(헤더 키 → 문자열 값)에서 배열의 배열로 변경하여 다운스트림 코드의 두 가지 일반적인 수집 패턴에 대응합니다. 필드 값은 추론된 타입이 아닌 문자열로 출력됩니다 - CSV에는 스키마가 없으므로 01234(제로 패딩 ID), 1e10(전화번호처럼 보이는 문자열로 JSON.parse가 숫자로 강제 변환), 2024-13-45(잘못된 날짜)가 모두 그대로 유지됩니다. 이는 의도적입니다: 다운스트림 타입 API가 zod, Joi 또는 명시적 규칙이 있는 수제 강제 변환 레이어를 적용할 수 있지만, 변환기가 이미 떨어뜨린 선행 0은 복구할 수 없습니다. 출력은 JSON.stringify(rows, null, 2)로 생성되고 구문 강조기를 통해 렌더링됩니다. 소스 CSV는 Blob에서 FileReader.readAsText()로 읽히며 백엔드에 업로드되지 않으므로, 인사 내보내기, 재무 원장, 고객 목록을 브라우저 세션을 벗어나지 않고 재구성할 수 있습니다.
- RFC 4180 문법: 구분자/CR/LF/"가 포함된 필드는 큰따옴표로 감싸야 합니다; 내부 따옴표는 ""로 이중 처리합니다.
- 상태: field_start, in_unquoted, in_quoted, after_quote의 단일 패스 O(n) 상태 머신입니다.
- UTF-8 BOM(EF BB BF / U+FEFF)은 헤더 키를 깨끗하게 유지하기 위해 파일 시작에서 제거됩니다.
- 유럽 스프레드시트는 로케일 설정에서 ,가 소수점 표시이므로 ;를 구분자로 자주 사용합니다.
- 첫 번째 행을 헤더로 사용하면 Array<Record<string,string>>와 Array<Array<string>> 간 출력이 전환됩니다.
- 모든 필드 값은 문자열로 유지됩니다; 타입 추론이 실행되지 않으므로 01234 같은 선행 0 ID가 보존됩니다.
- FileReader.readAsText()로 Blob을 로컬에서 처리합니다; 업로드되지 않으므로 인사/재무/스테이징 내보내기에 안전합니다.
예시
헤더가 포함된 기본 CSV -> JSON 객체 배열
CSV 입력:
name,age,city
Alice,28,New York
Bob,35,London
Carol,42,Tokyo
JSON 출력:
[
{ "name": "Alice", "age": "28", "city": "New York" },
{ "name": "Bob", "age": "35", "city": "London" },
{ "name": "Carol", "age": "42", "city": "Tokyo" }
]쉼표가 포함된 따옴표 처리 필드
CSV 입력:
id,product,description
1,"Notebook, A5","Hard cover, 200 pages"
2,Pen,"Black ink, 0.5mm"
JSON 출력:
[
{ "id": "1", "product": "Notebook, A5", "description": "Hard cover, 200 pages" },
{ "id": "2", "product": "Pen", "description": "Black ink, 0.5mm" }
]헤더가 없는 TSV (탭 구분)
TSV 입력 (구분자 = Tab, 헤더 없음):
101 Alice 98.5
102 Bob 87.0
103 Carol 92.3
JSON 출력:
[
["101", "Alice", "98.5"],
["102", "Bob", "87.0"],
["103", "Carol", "92.3"]
]세미콜론 구분자 (유럽 스프레드시트 내보내기)
CSV 입력 (구분자 = ;):
product;price_eur;stock
Keyboard;49,90;120
Mouse;19,90;345
JSON 출력:
[
{ "product": "Keyboard", "price_eur": "49,90", "stock": "120" },
{ "product": "Mouse", "price_eur": "19,90", "stock": "345" }
]
참고: 숫자는 문자열로 유지되므로 후속 코드에서 형 변환이 필요합니다.자주 묻는 질문
어떤 CSV 변형이 지원되나요?
표준 RFC 4180 CSV(쉼표 구분, 큰따옴표로 필드 인용, 큰따옴표를 두 번 써서 이스케이프)를 지원합니다. 구분자만 바꾸면 탭 구분(TSV)이나 세미콜론 구분 CSV도 처리할 수 있습니다. 줄바꿈 문자(LF/CRLF/CR)는 자동으로 처리됩니다.
헤더는 어떻게 처리되나요?
'첫 행을 헤더로' 옵션을 켜면 파서가 각 헤더 셀을 해당 열의 JSON 키로 사용해 객체 배열을 만듭니다. 헤더를 끄면 배열의 배열로 출력됩니다. 빈 헤더 셀에는 숫자형 플레이스홀더 키가 부여됩니다.
데이터 타입은 어떻게 추론되나요?
기본적으로는 모두 문자열입니다. '자동 타입(auto type)' 옵션을 켜면 숫자, 불리언(true/false), null 파싱을 시도합니다. 앞에 0이 붙은 숫자(00123, 0042)는 접두 0을 잃지 않도록 문자열로 유지되니, ID나 우편번호에 적합합니다.
필드에 쉼표나 줄바꿈이 포함되어 있다면?
필드를 큰따옴표로 감싸세요. 예: "Smith, John" 또는 "line one\nline two". 필드 내부의 큰따옴표는 두 번 써서 이스케이프합니다: "He said ""hi""". 파서는 이런 경우를 모두 처리하며, 행이 깨진다면 보통 따옴표가 짝이 맞지 않는 것이 원인입니다.
변환은 로컬에서 처리되나요, 서버에서 처리되나요?
로컬에서 처리됩니다. 파싱은 JavaScript로 브라우저에서 실행되며 붙여넣은 CSV는 페이지를 떠나지 않습니다. 큰 파일은 브라우저를 느리게 만들 수 있으므로, 수십 MB가 넘으면 분할해서 처리하세요.
열 순서가 유지되나요?
네. 각 행은 CSV 헤더 순서와 동일한 키 순서를 가진 JSON 객체가 되며, 최신 엔진의 JSON.stringify는 삽입 순서를 보존합니다. 이후 도구에서 키 순서를 보존하지 않는다면 그것은 그 도구의 한계입니다.
날짜는 어떻게 처리해야 하나요?
날짜는 문자열로 유지됩니다. 모든 날짜 형식에 통용되는 표준이 없기 때문에(예: 1/2/2024는 미국에서 1월 2일, 유럽에서 2월 1일) 자동 타입 추론은 임의의 날짜 형식을 파싱하지 않습니다. 이후 단계에서 네이티브 Date 객체가 필요하다면 가져오기 전에 ISO 8601 형식(YYYY-MM-DD)으로 변환해 두세요.