viewer.csslab.dev

CSV 뷰어·변환기

구분자를 추측해 표로 열고, JSON 으로 바꾼다.

CSV 란?

CSV 는 표 형태의 데이터를 평문으로 담는다. 한 줄에 한 레코드, 필드는 구분자로 나뉜다. 공식적인 타입 체계도, 하나로 합의된 명세도 없다. 같은 확장자 아래 쉼표·세미콜론·탭·파이프로 나뉜 파일이 뒤섞여 있고, 도구마다 같은 파일을 다르게 읽는 이유가 그것이다.

이 뷰어는 파일을 읽어, 따옴표 밖에서 각 후보가 줄마다 얼마나 일정하게 나타나는지를 보고 구분자를 추측한 뒤, 스크롤되는 표나 JSON 으로 보여준다. 모든 파싱이 브라우저에서 일어나므로 고객 데이터나 내부 리포트를 어디에도 올리지 않고 열어볼 수 있다.

Within the header and each record, there may be one or more fields, separated by commas. Each line should contain the same number of fields throughout the file.
RFC 4180 §2

기능

구분자를 추측하고, 무엇으로 골랐는지 말한다
쉼표·세미콜론·탭·파이프를 모두 시험해 줄마다 얼마나 고르게 나타나는지로 고른다. 따옴표 안은 세지 않는다. 한국어·유럽 로캘의 엑셀은 세미콜론으로 내보내는데, 쉼표라고 가정하는 도구는 한 열짜리 뭉텅이를 보여준다.
따옴표를 제대로
구분자가 든 따옴표 필드, 필드 안의 줄바꿈, 두 번 쓴 따옴표("")를 RFC 4180 대로 다룬다. "성, 이름" 은 한 필드로 남는다.
칸 수가 안 맞는 줄을 알린다
헤더보다 칸이 많거나 적은 줄을 조용히 자르지 않고 알려 준다. 대개 따옴표가 빠진 자리이고, 그걸 운영에서 발견하면 훨씬 비싸다.
말이 되는 타입으로 JSON 변환
숫자와 불리언은 진짜 JSON 타입이 되지만 앞자리가 0 인 값은 문자열로 남는다. 우편번호와 전화번호가 첫 자리를 잃지 않는다.
큰 파일에서도 멈추지 않는다
표는 앞 200행만 그리고 전체 개수를 함께 알린다. 큰 내보내기 파일을 열어도 화면이 굳지 않는다.

사용법

  1. 1

    데이터를 붙여넣는다

    CSV·TSV 등 구분자로 나뉜 텍스트를 왼쪽에 붙여넣는다.

  2. 2

    구분자를 확인한다

    자동이 추측하고 무엇을 골랐는지 보여준다. 틀렸으면 직접 고른다.

  3. 3

    첫 줄이 헤더인지 정한다

    헤더가 있으면 첫 줄에서 열 이름을 가져오고, 없으면 열에 번호를 매긴다.

  4. 4

    표나 JSON 으로 읽는다

    보기를 바꿔 가며 읽고, 요청 본문이나 픽스처에 넣을 JSON 을 복사한다.

UTF-8 CSV 인데 엑셀에서 한글이 깨지는 이유

엑셀은 .csv 파일에서 UTF-8 을 알아서 감지하지 않는다. 바이트 순서 표시(BOM)가 없으면 시스템의 옛 코드 페이지로 — 한국어 윈도우라면 CP949 로 — 디코딩하고, 여러 바이트로 된 글자는 모조리 깨진 문자열이 된다. 파일이 망가진 것이 아니라 틀린 전제로 읽히고 있는 것이다.

해결은 UTF-8 BOM 이다. 파일 맨 앞의 세 바이트 EF BB BF 를 엑셀이 "UTF-8 로 읽으라"는 신호로 받아들인다. 대가도 알아 두어야 한다 — 그 바이트는 데이터가 아니어서, 같은 파일을 엄격한 파서로 읽으면 첫 열 이름이 id 가 아니라 U+FEFF 가 앞에 붙은 id 로 잡힌다. 이 뷰어가 읽을 때 앞의 BOM 을 떼어내는 이유이고, 엑셀에 줄 파일에는 반대로 붙여야 하는 이유다.

자주 묻는 질문

CSV 가 한 열로만 열린다

구분자가 맞지 않는 것이다. 쉼표를 소수점으로 쓰는 로캘 — 한국어·독일어·프랑스어 등 — 에서 엑셀은 세미콜론으로 내보낸다. 쉼표라고 가정하는 뷰어는 한 줄을 한 필드로 본다. 구분자를 세미콜론으로 바꾸거나, 자동으로 두면 후보마다 줄 간 일관성을 따져 고른다.

CSV 를 JSON 으로 어떻게 바꾸나?

CSV 를 붙여넣고 "첫 줄이 헤더" 를 켠 채로 — 그래야 헤더 이름이 키가 된다 — 출력을 JSON 으로 바꾼다. 각 행이 배열 안의 객체 하나가 된다.

필드 안의 쉼표도 되나?

따옴표로 감싸면 된다. "성, 이름" 은 한 필드다. 따옴표 안의 줄바꿈, 이스케이프를 위해 두 번 쓴 따옴표도 RFC 4180 대로 처리한다.

우편번호의 앞자리 0 이 사라진다

이 도구에서는 사라지지 않는다. 타입을 추론할 때 앞자리가 0 인 값은 문자열로 남긴다. 원인은 대개 스프레드시트다 — 불러올 때 03187 을 숫자 3187 로 바꿔 버리고, 변환기에 오기도 전에 0 이 없어진다.

CSV 가 업로드되나?

아니다. 파싱은 브라우저에서 일어나고 페이지에 백엔드가 없다. 고객 목록이나 내부 내보내기 파일이 기기 밖으로 나가지 않는다.

CSV 와 TSV 는 뭐가 다른가?

구분자만 다르다. TSV 는 탭으로 나눈다. 탭은 데이터 안에 잘 나타나지 않아 따옴표를 훨씬 덜 써도 되고, 그래서 데이터 파이프라인이 선호한다. 이 뷰어는 둘 다 읽는다.

이 도구가 따르는 규격

함께 쓰는 도구