이 CSV JSONL 변환기는 하나의 큰 배열 대신 한 줄에 JSON 값 하나씩 출력합니다. 데이터 웨어하우스 로더(BigQuery 등), jq·grep 파이프라인, 로그 수집기, .jsonl로 올리는 파인튜닝 데이터셋처럼 줄 단위로 읽는 도구가 기대하는 형태입니다. 파일 전체를 메모리에 올리지 않고 한 줄씩 처리할 수 있습니다.
CSV의 각 레코드는 헤더를 키로 하는 압축된 객체 한 줄이 됩니다. 헤더가 없는 파일이라면 "첫 행은 헤더"를 끄세요. 레코드마다 JSON 배열 한 줄이 됩니다. 읽기 방식과 타입 규칙은 CSV JSON 변환기와 같아서 따옴표, 구분자, 빈 줄, 숫자로 바뀌는 열에 대해 두 도구가 같은 결과를 냅니다.
CSV 파싱과 JSON 줄 출력은 브라우저 안에서 이뤄지며 서버로 전송되지 않습니다. 입력은 20 MiB, 데이터 행 50,000개, 열 200개까지이고, 다운로드 파일 이름은 data.jsonl입니다.
사용 방법
CSV 준비
행을 붙여 넣거나 .csv, .tsv 파일을 편집기에 끌어다 놓거나 파일 열기 버튼으로 엽니다. "첫 행은 헤더"를 끄지 않는 한 첫 줄은 헤더여야 합니다.
구분자 확인
구분자가 "자동 감지"이면 입력창 아래 배지에 찾아낸 구분자가 표시됩니다. 틀렸다면 쉼표, 세미콜론, 탭, 파이프 중에서 직접 고르세요.
헤더·타입 설정
헤더를 켜면 한 줄이 객체, 끄면 배열입니다. 기본으로 켜진 "숫자·불리언·null 감지"는 빈 셀과 null 단어를
null로 씁니다. 모든 값을 적힌 그대로의 텍스트로 두려면 끄세요.읽은 결과 확인
"파일을 읽은 결과" 패널에서 앞쪽 레코드와 줄 번호, 열별 타입을 보고, 통계에서 행·열·레코드 수를 확인합니다. 레코드는 항상 한 줄로 쓰므로 들여쓰기 옵션은 없습니다.
복사 또는 다운로드
줄을 복사하거나
data.jsonl로 내려받습니다. 마지막 줄을 포함해 모든 줄이 줄바꿈으로 끝나므로 파일을 고치지 않고 이어 붙일 수 있습니다.
작동 원리
JSON Lines를 한 문단으로
JSON Lines(NDJSON이라고도 부름)는 한 줄이 완전하고 유효한 JSON 값 하나이며 줄은 LF로 구분하는 텍스트 형식입니다. 레코드 사이에 쉼표가 없고 전체를 감싸는 대괄호도 없으며, 인코딩은 UTF-8입니다. 레코드가 여러 줄에 걸치지 않으므로 일반 줄 단위 도구로 스트리밍, 이어 붙이기, 분할을 할 수 있습니다.
한 줄 안에는 실제 줄바꿈을 넣을 수 없으므로 따옴표로 감싼 CSV 셀 안의 줄바꿈은 JSON 문자열에서 \n으로 씁니다. U+2028과 U+2029도 \u2028, \u2029로 이스케이프합니다. JSON.stringify는 이 문자를 그대로 두는데, 여러 줄 분할 도구가 이를 줄바꿈으로 보고 레코드를 둘로 잘라 버리기 때문입니다.
CSV 레코드가 줄로 바뀌는 방식
변환기는 파일을 한 번 읽어 전체 레코드를 기준으로 열마다 타입을 하나 정한 뒤, 각 레코드를 압축된 JSON.stringify 결과로 한 줄씩 씁니다. 헤더를 켜면 레코드는 {"id":1,"name":"Ari"}, 끄면 [1,"Ari"]가 됩니다. 키 순서는 헤더의 열 순서를 따릅니다.
헤더 셀은 앞뒤 공백을 제거하고, 빈 이름은 column_N, 중복 이름은 _2, _3 접미사를 받으므로 키가 조용히 덮어써지지 않습니다. 셀이 모자란 레코드는 두 모드 모두 전체 너비로 채우므로 모든 줄의 키 구성이나 배열 길이가 같습니다.
| 설정 | 레코드 1,Ari, 에 대해 쓰는 줄 |
|---|---|
| 헤더 id,name,note 켬, 감지 켬 | {"id":1,"name":"Ari","note":null} |
| 헤더 id,name,note 켬, 감지 끔 | {"id":"1","name":"Ari","note":""} |
| 헤더 행 없음, 감지 켬 | [1,"Ari",null] |
빈 값과 누락 값
감지를 켜면 빈 셀과 "null로 볼 단어"의 단어(기본값 NA, N/A, null, none, undefined, 대소문자 무관)는 객체 줄이든 배열 줄이든 null로 쓰입니다. 그래서 로더는 빈 문자열이 아닌 진짜 JSON null을 받습니다. 감지를 끄면 빈 셀은 "", NA는 문자열 "NA"로 남습니다. "빈 줄 건너뛰기"가 켜져 있으면 파일의 빈 줄은 아무 줄도 만들지 않습니다.
실제 예시
id,name,score
1,Ari,9.5
2,Bea,{"id":1,"name":"Ari","score":9.5}
{"id":2,"name":"Bea","score":null}비어 있는 score는 null로 쓰이고 score 열은 숫자 열로 유지됩니다.
1,Ari
2,Bea[1,"Ari"]
[2,"Bea"]"첫 행은 헤더"를 끈 결과입니다. 레코드마다 배열 한 줄이 됩니다.
"last, first";age
"Doe, Jane";41
"Roe, Rick";38{"last, first":"Doe, Jane","age":41}
{"last, first":"Roe, Rick","age":38}세 레코드가 모두 두 열로 나뉘므로 자동 감지가 세미콜론을 골랐습니다. 따옴표 안 이름의 쉼표에 속지 않았습니다.
name,note
Bea,"two
lines"{"name":"Bea","note":"two\nlines"}줄바꿈이 이스케이프되어 레코드는 여전히 한 줄입니다.
id,name,score
1,Ari,9.5
2,Bea,{"id":"1","name":"Ari","score":"9.5"}
{"id":"2","name":"Bea","score":""}모든 값이 문자열이고 빈 score는 빈 문자열입니다. 모든 열이 텍스트인 스테이징 테이블에 적재할 때 알맞습니다.
자주 하는 실수
JSONL 파일은 JSON 파일이 아님
출력을 손으로 대괄호로 감싸도 줄 사이에 쉼표가 없어 유효한 JSON이 되지 않습니다. 배열이 필요한 도구에는 CSV JSON 변환기를 쓰세요.
값 하나가 모든 줄의 열 타입을 바꿈
타입은 파일 전체를 보고 열 단위로 정합니다.
3,5,ask가 든qty열은ask가 있는 줄만이 아니라 모든 줄에서 문자열로 쓰입니다. 로더가 숫자를 기대한다면 그 셀을 고치거나 단어를 null 목록에 추가하세요.학습용 텍스트 속의 null 단어
파인튜닝 파일에서 답변이 글자 그대로
None이나NA라면, null 단어는 모든 열에 적용되므로null이 됩니다. 이런 단어가 답변에 들어갈 수 있다면 내보내기 전에 "null로 볼 단어"에서 지우거나 감지를 끄세요.파인튜닝 형식은 특정 구조를 요구함
평평한 CSV 레코드는 평평한 객체가 됩니다. 채팅형 학습 파일은 보통
messages배열 같은 중첩 구조가 필요한데, 이 변환기는 중첩 값을 만들지 않습니다. 먼저 변환한 뒤 스크립트로 구조를 바꾸세요.빈 줄 건너뛰기를 끈 경우
"빈 줄 건너뛰기"를 끄면 빈 줄마다
{"sku":null,"qty":null}같은 null 레코드가 생기고, 안내 문구는 이를 셀 수가 다른 레코드로 셉니다. 빈 레코드에 의미가 있는 경우가 아니라면 켜 두세요.파일과 맞지 않게 지정한 구분자
모든 줄이
a;b같은 긴 키 하나로 나온다면 세미콜론 파일에 쉼표를 지정한 것입니다. 구분자를 "자동 감지"나 파일이 실제로 쓰는 구분자로 되돌리세요.
자주 묻는 질문
JSONL과 NDJSON은 무엇이 다른가요?
실무에서는 같은 형식입니다. 한 줄에 JSON 값 하나, 줄은 LF로 구분합니다. 같은 개념을 설명하는 두 명세에서 이름이 나왔고 대부분의 도구가 두 확장자를 모두 받습니다.
결과를 BigQuery에 올릴 수 있나요?
BigQuery는 줄바꿈 구분 JSON을 로드 형식으로 지원하므로 출력 파일을 원본으로 쓸 수 있습니다. 감지를 켜면 빈 셀은 JSON null로, 숫자 열은 숫자로 들어가니 선언한 스키마와 맞는지 확인하세요.
CSV 레코드 하나가 정확히 한 줄이 되나요?
그렇습니다. 헤더 행은 줄로 쓰지 않고, 건너뛴 빈 줄은 줄을 만들지 않으며, 줄바꿈이 든 따옴표 셀도 한 줄로 나옵니다. 결과 아래의 레코드 수가 쓰인 줄 수입니다.
셀 안의 따옴표와 쉼표는 어떻게 처리되나요?
파서가 RFC 4180 따옴표 규칙을 따르므로 따옴표 셀의 쉼표, 겹따옴표, 줄바꿈이 보존됩니다. 그 뒤 JSON 쓰기 단계에서 문자열 안의 따옴표와 줄바꿈을 이스케이프합니다.
어떤 확장자를 써야 하나요?
다운로드 파일 이름은 data.jsonl입니다. 받는 쪽이 .ndjson을 요구하면 이름만 바꾸세요. 내용은 같습니다.
데이터가 업로드되나요?
아니요. 레코드는 브라우저 안에서 JSON 줄로 바뀌며 서버로 전송되지 않습니다. 결과는 페이지에서 복사하거나 내려받습니다.
마지막 업데이트:
