CSV는 데이터베이스나 스프레드시트에 불러오기 전까지는 단순해 보이다가, 우편번호의 앞자리 0이 사라지는 순간 문제가 드러납니다. 이 뷰어는 파일을 브라우저에서 읽어 구분자를 찾고 RFC 4180 따옴표 규칙대로 해석한 뒤 프로파일을 만듭니다. 맨 위에 행, 열, 빈 셀, 중복 행, 키 후보 합계가 나오고, 그 아래 열마다 카드 한 장에 추정 타입, 빈 값과 고유값 개수, 타입에 맞는 통계가 담깁니다.
가져오기, 조인, 변환 직전에 쓰도록 만들었습니다. 나이 열이 정말 숫자인지, id 열이 겹치지 않는지, 완전히 같은 레코드가 있는지, 유럽식 로캘에서 내보낸 세미콜론 파일이 제대로 나뉘었는지, 코드 열을 문자열로 남겨야 하는지 확인할 수 있습니다. 카드 아래 데이터 표에는 모든 레코드가 시작하는 줄 번호와 함께 나오고, 모든 셀을 검색하거나 열마다 정렬할 수 있으며 프로파일을 CSV 보고서로 내려받을 수 있습니다.
파일은 브라우저 탭 안에서만 처리되며 업로드되지 않습니다. 한도는 입력 20MiB, 데이터 50,000행, 200열입니다.
사용 방법
파일 붙여 넣기 또는 열기
편집기에 CSV 텍스트를 붙여 넣거나
.csv,.tsv파일을 끌어다 놓거나 파일 열기를 누릅니다. 주문 목록, 세미콜론 내보내기, 지저분한 파일 예제로 시작해도 됩니다.읽는 방식 설정
구분자는 따로 쉼표, 세미콜론, 탭, 파이프를 고르지 않으면 자동 감지로 둡니다. 열 이름이 없는 파일이면 "첫 행은 헤더"를 끄고, 빈 줄을 버리려면 "빈 줄 건너뛰기"를 켜 둡니다. "null로 볼 단어"(기본값
NA, N/A, null, none, undefined)는 데이터에 맞게 고칩니다.요약 읽기
맨 위 줄에 행, 열, 빈 셀, 중복 행, 키 후보, 구분자가 표시됩니다. 구분자를 직접 고르지 않고 추측했다면 "자동 감지"라고 붙습니다. 파일이 바이트 순서 표시(BOM)로 시작하면 그 위에 UTF-8, UTF-16 LE, UTF-16 BE 중 무엇인지 알려 주는 배지가 나옵니다.
열 카드 살펴보기
카드마다 타입 배지(숫자, 날짜, 불리언, 텍스트, 비어 있음), 채워진 셀 비율 막대, 빈 값과 고유값 개수가 있습니다. 숫자 열은 최솟값, 최댓값, 평균, 중앙값과 막대 10개짜리 히스토그램을, 나머지 열은 가장 많은 값을 보여 주고, 텍스트는 길이, 날짜는 범위가 붙습니다. "모든 행에서 고유", "앞자리 0", "숫자로 담기엔 자릿수가 많음", 앞뒤 공백이 있는 셀, "항상 비어 있음" 배지도 달립니다. 열 이름으로 카드를 거를 수 있고, 카드를 누르면 아래 표에서 그 열이 강조됩니다.
데이터 표 검색과 정렬
행 검색에 글자를 입력하면 어느 셀에든 그 글자가 든 레코드만 남습니다. 열 제목을 한 번 누르면 오름차순, 두 번 누르면 내림차순, 세 번 누르면 파일 순서로 돌아갑니다. 표는 조건에 맞는 처음 100행을 보여 주고, 더 보기 버튼을 누를 때마다 최대 400행씩 늘어납니다.
프로파일 내려받기 또는 복사
프로파일 내려받기 (CSV)는
csv-profile.csv를 저장하고, 프로파일 복사는 같은 내용을 클립보드에 넣습니다. 열마다 한 행씩 타입, 행 수, 빈 값 수, 빈 값 비율, 고유값 수, 최솟값, 최댓값, 평균, 중앙값이 들어가고, 경고 열에는 해당하는 경우leading zeros와too many digits for a number가 적힙니다.
작동 원리
파서가 CSV를 읽는 방식
읽기 규칙은 RFC 4180을 따릅니다. 레코드는 줄바꿈으로, 필드는 구분자로 나누고, 구분자·큰따옴표·줄바꿈이 든 필드는 큰따옴표로 감싸며 안쪽 큰따옴표는 두 번 씁니다. 그래서 "hello, world"는 값 하나로 남고 따옴표로 감싼 값은 여러 줄에 걸칠 수 있습니다. LF, CRLF, 옛 Mac 방식의 CR 줄 끝을 모두 받고, 엑셀의 sep=; 첫 줄은 레코드로 세지 않고 구분자 지정으로만 씁니다. 열거나 끌어다 놓은 파일은 바이트 그대로 읽기 때문에 BOM을 알아채서 첫 열 이름에 섞지 않고 따로 알려 줍니다. UTF-16 파일은 BOM으로 알아보고 디코딩하며, 그 밖의 파일은 UTF-8로 읽습니다. 따옴표가 끝까지 닫히지 않으면 따옴표가 열린 줄과 열을 알려 주고 프로파일을 멈춥니다.
"빈 줄 건너뛰기"를 켜면 비어 있거나 구분자와 공백만 있는 줄을 가장 먼저 걸러 내므로, 그런 줄 때문에 다음 레코드의 셀이 밀리는 일이 없습니다. 끄면 그 줄이 빈 셀로만 된 레코드로 남아 빈 값으로 집계되고 중복 행으로 잡힐 수도 있습니다.
구분자를 감지하는 방법
후보(쉼표, 세미콜론, 탭, 파이프)마다 앞쪽 레코드를 최대 30개까지 실제로 나눠 보고 가장 흔한 열 개수를 찾습니다. 그 열 개수가 나오는 레코드 비율이 가장 높은 후보가 이기고, 비율이 같으면 열이 더 많은 쪽을 고릅니다. 가장 흔한 열 개수가 1인 후보는 제외하며, 모두 제외되면 쉼표를 씁니다. 첫 줄의 문자 개수를 세는 대신 레코드 전체를 보기 때문에, 세미콜론 파일 안의 따옴표 속 쉼표에 속지 않습니다.
열 타입을 정하는 방법
빈 셀, 공백만 있는 셀, "null로 볼 단어"에 든 단어(대소문자 무관)는 빈 값으로 보고 타입 판정에서 뺍니다. 남은 값이 모두 한 패턴에 맞아야 그 타입이 됩니다. 숫자, 불리언, 날짜 순서로 검사하므로 1과 0만 있는 열은 숫자가 됩니다.
| 타입 | 채워진 모든 값의 조건 | 예 |
|---|---|---|
| 숫자 | 선택적 부호, 숫자, 선택적 소수부, 선택적 지수 | -12, 3.5, .5, 1e3, 007 |
| 불리언 | true, false, yes, no (대소문자 무관) | Yes, false |
| 날짜 | 실제로 존재하는 YYYY-MM-DD 날짜로 시작하고 뒤에 T나 공백이 올 수 있음 | 2026-01-05, 2026-02-11 10:00 |
| 텍스트 | 그 밖의 모든 경우, 또는 위 유형이 섞인 경우 | $12, 1,200, 5kg |
| 비어 있음 | 채워진 값이 하나도 없음 | (빈 열) |
통계가 뜻하는 것
중복 행은 앞선 레코드와 셀 하나하나까지 같은 레코드 수이며 첫 번째 것은 세지 않습니다. 키 후보는 행이 두 개 이상이고 모든 행에 값이 있으며 같은 값이 두 번 나오지 않는 열입니다. 값은 적힌 그대로 비교하므로 Busan과 Busan은 다른 값이고, 앞뒤 공백 배지가 이런 경우를 알려 줍니다.
숫자 열의 중앙값은 정렬했을 때 가운데 값이고, 히스토그램은 최솟값부터 최댓값까지를 같은 폭의 구간 10개로 나눈 것입니다. 평균과 중앙값이 크게 벌어지면 히스토그램에서 튀는 값을 바로 찾을 수 있습니다. 01234 같은 값이 든 숫자 열에는 앞자리 0 배지가 붙는데, 진짜 숫자로 바꾸면 01234가 1234가 되기 때문입니다. 19자리 ID, 2^53보다 큰 정수, 0.1234567890123456789처럼 숫자형이 자릿수 그대로 담지 못하는 값이 있으면 "숫자로 담기엔 자릿수가 많음" 배지가 붙습니다. 이 열의 통계는 반올림된 값으로 계산되며, 가져올 때는 텍스트로 두어야 합니다.
실제 예시
name,age,plan
Ari,29,pro
Bea,,free
Cy,31,pro행 3 · 열 3 · 빈 셀 1 · 중복 행 0 · 키 후보 1 · 구분자 쉼표 (자동 감지)
name · 텍스트 · 모든 행에서 고유
빈 값 0 / 3, 고유값 3, 길이 2–3
가장 많은 값: "Ari" ×1, "Bea" ×1, "Cy" ×1
age · 숫자
빈 값 1 / 3, 고유값 2, 최솟값 29, 최댓값 31, 평균 30, 중앙값 30
히스토그램 1 0 0 0 0 0 0 0 0 1
plan · 텍스트
빈 값 0 / 3, 고유값 2, 길이 3–4
가장 많은 값: "pro" ×2, "free" ×1비어 있는 age 셀은 빈 값으로 세고 최솟값, 최댓값, 평균, 중앙값에서 뺍니다. 모든 행에 값이 있고 겹치지 않는 열은 name뿐이라 키 후보가 하나입니다.
zip;city;joined;active
01234;Seoul;2026-01-05;yes
10001;NYC;2026-02-11 10:00;no
02139;Boston;n/a;yescolumn,type,rows,missing,missing_rate,unique,min,max,mean,median,warning
"zip","number","3","0","0.0%","3","1234","10001","4458","2139","leading zeros"
"city","text","3","0","0.0%","3","","","","",""
"joined","date","3","1","33.3%","2","","","","",""
"active","boolean","3","0","0.0%","2","","","","",""프로파일 내려받기 (CSV)로 저장되는 파일 그대로입니다. 구분자는 세미콜론으로 감지되고, zip 열은 숫자지만 leading zeros 경고가 붙으므로 텍스트로 가져와야 합니다. 카드에서는 joined의 범위가 2026-01-05 → 2026-02-11로 나오고 n/a는 빈 값으로 셉니다.
zip,city,city,visits
01234,Seoul,KR,10
10001,"New York",US,
02139,Boston,US,7,extra행 3 · 열 5 · 빈 셀 3 · 중복 행 0 · 키 후보 2 · 구분자 쉼표 (자동 감지)
zip · 숫자 · 모든 행에서 고유, 앞자리 0
빈 값 0 / 3, 고유값 3, 최솟값 1,234, 최댓값 10,001, 평균 4,458, 중앙값 2,139
히스토그램 1 1 0 0 0 0 0 0 0 1
city · 텍스트 · 모든 행에서 고유
빈 값 0 / 3, 고유값 3, 길이 5–8
가장 많은 값: "Boston" ×1, "New York" ×1, "Seoul" ×1
city_2 · 텍스트
빈 값 0 / 3, 고유값 2, 길이 2–2
가장 많은 값: "US" ×2, "KR" ×1
visits · 숫자
빈 값 1 / 3, 고유값 2, 최솟값 7, 최댓값 10, 평균 8.5, 중앙값 8.5
히스토그램 1 0 0 0 0 0 0 0 0 1
column_5 · 텍스트
빈 값 2 / 3, 고유값 1, 길이 5–5
가장 많은 값: "extra" ×1빈 줄 두 개는 건너뛰고, 표에는 3번째, 4번째, 6번째 줄의 레코드가 나옵니다. 겹치는 헤더는 city_2로 바뀌고, 6번째 줄의 다섯 번째 셀은 따로 column_5 열이 되어 나머지 두 행에서는 비어 있습니다.
order_id,city,score
1790000000000000001,Seoul,4.5
1790000000000000002, Busan,3
1790000000000000002, Busan,3
,,
1790000000000000003,Daegu,1e3행 4 · 열 3 · 빈 셀 0 · 중복 행 1 · 키 후보 0 · 구분자 쉼표 (자동 감지)
order_id · 숫자 · 숫자로 담기엔 자릿수가 많음
빈 값 0 / 4, 고유값 3, 최솟값 1,790,000,000,000,000,000, 최댓값 1,790,000,000,000,000,000, 평균 1,790,000,000,000,000,000, 중앙값 1,790,000,000,000,000,000
히스토그램 4 0 0 0 0 0 0 0 0 0
city · 텍스트 · 앞뒤 공백이 있는 셀 2개
빈 값 0 / 4, 고유값 3, 길이 5–6
가장 많은 값: " Busan" ×2, "Daegu" ×1, "Seoul" ×1
score · 숫자
빈 값 0 / 4, 고유값 3, 최솟값 3, 최댓값 1,000, 평균 252.625, 중앙값 3.75
히스토그램 3 0 0 0 0 0 0 0 0 1고유값은 서로 다른 ID 3개로 세지만 최솟값, 최댓값, 평균, 중앙값은 모두 같은 반올림 값으로 뭉개집니다. 자릿수 배지가 경고하는 것이 바로 이 현상입니다. ,, 줄은 구분자만 있어 건너뜁니다. 3번째 줄과 4번째 줄이 똑같아 중복 행이 1개이고 키 후보는 없습니다. 1e3은 1000으로 읽히며, 히스토그램과 평균·중앙값의 차이가 모두 이 값을 가리킵니다.
sku;"Tags, colors, sizes";price
KB-100;"usb, wired";49.90
MS-220;wireless;19.00
MN-27;"27 inch, 4k, hdr";289.00행 3 · 열 3 · 빈 셀 0 · 중복 행 0 · 키 후보 3 · 구분자 세미콜론 (자동 감지)
sku · 텍스트 · 모든 행에서 고유
빈 값 0 / 3, 고유값 3, 길이 5–6
가장 많은 값: "KB-100" ×1, "MN-27" ×1, "MS-220" ×1
Tags, colors, sizes · 텍스트 · 모든 행에서 고유
빈 값 0 / 3, 고유값 3, 길이 8–16
가장 많은 값: "27 inch, 4k, hdr" ×1, "usb, wired" ×1, "wireless" ×1
price · 숫자 · 모든 행에서 고유
빈 값 0 / 3, 고유값 3, 최솟값 19, 최댓값 289, 평균 119.3, 중앙값 49.9
히스토그램 1 1 0 0 0 0 0 0 0 1쉼표로 나누면 네 레코드가 각각 3, 2, 1, 3열이 됩니다. 세미콜론은 모든 레코드에서 3열이라 이쪽이 선택되고, 따옴표 속 쉼표는 값 안에 그대로 남습니다.
자주 하는 실수
긴 행은 열을 늘리고 짧은 행은 채워짐
헤더보다 셀이 많은 레코드가 있으면
column_5,column_6같은 열이 새로 생기고, 셀이 모자란 레코드는 빈 셀로 채워져 빈 값으로 집계됩니다. 비어 있거나 겹치는 헤더 이름도column_3,city_2처럼 바뀝니다. 어느 줄의 길이가 달랐는지는 뷰어가 아니라 CSV 검사기에서 확인하세요.천 단위 구분이나 통화 표시가 있으면 텍스트
쉼표 구분 파일의
1,200은 따옴표로 감싸지 않으면 두 필드로 갈라지고,$12나5kg가 하나라도 있으면 열 전체가 텍스트가 됩니다. 최솟값, 최댓값, 평균을 믿기 전에 값을 정리하세요.null 단어가 실제 값을 가릴 수 있음
기본 설정에서는
NA,N/A,null,none,undefined를 대소문자 구분 없이 빈 값으로 봅니다. 데이터에서None이 실제 분류값이라면 "null로 볼 단어"에서 지우세요. 그러면 그 셀이 다시 값으로 집계됩니다.공백 하나로 고유값이 달라짐
타입 판정은 값의 앞뒤 공백을 잘라 내고 하지만, 고유값 수, 키 후보, 중복 행은 값을 적힌 그대로 비교합니다. 그래서
Busan과Busan은 서로 다른 도시로 셉니다. 고유값 수를 믿기 전에 앞뒤 공백 배지를 확인하세요.날짜 타입은 실제 날짜를 확인
실제로 존재하는
YYYY-MM-DD날짜로 시작해야 날짜로 봅니다. 따라서2024-02-29는 통과하지만2023-02-29와2026-13-45는 텍스트로 남습니다. 뒤에 T나 공백으로 시간이 이어질 수 있으며, 카드의 범위는 검증된 앞 열 자리 날짜를 비교합니다.자동 감지에도 도움이 필요할 때
열이 하나뿐인 파일은 쉼표로 간주하고, 두 후보가 모든 레코드를 똑같이 고르게 나누면 쉼표, 세미콜론, 탭, 파이프 순서에서 앞선 것이 선택됩니다. 열 이름이 이상해 보이면 구분자를 직접 고르세요.
자주 묻는 질문
CSV 뷰어가 파일을 서버로 업로드하나요?
아니요. 파일은 브라우저에서 읽으며 서버로 전송되지 않습니다.
파일 크기와 행 수 제한은 얼마인가요?
입력 20MiB, 데이터 50,000행, 200열까지입니다. 이를 넘으면 잘라서 보여 주지 않고 안내 문구와 함께 거부합니다.
TSV나 세미콜론 구분 파일도 열 수 있나요?
네. 앞쪽 레코드 30개에서 쉼표, 세미콜론, 탭, 파이프를 비교해 열 개수가 가장 고르게 나오는 구분자를 고릅니다. 구분자를 직접 지정할 수도 있고, 엑셀의 sep= 첫 줄도 따릅니다.
숫자 열인데 텍스트로 표시되는 이유는 무엇인가요?
채워진 값 중 하나 이상이 순수한 숫자가 아니기 때문입니다(예: $12, 1,200, 5kg, 섞여 든 메모). 표에서 그 값을 검색하거나 열을 정렬해 숫자 사이에서 찾아낸 뒤 원본에서 고치세요.
키 후보는 무엇을 뜻하나요?
모든 행에 값이 있고 같은 값이 한 번도 반복되지 않는 열의 개수입니다. 이런 열은 기본 키나 조인 키로 쓸 수 있습니다. 빈칸이나 겹치는 값이 하나라도 있으면 후보에서 빠집니다.
중복 행은 어떻게 세나요?
모든 셀이 앞선 레코드와 정확히 같으면 중복으로 셉니다. 첫 번째 것은 세지 않으므로 똑같은 레코드 세 개는 2로 집계됩니다. "빈 줄 건너뛰기"가 켜져 있으면 빈 줄은 이 검사 전에 빠집니다.
CSV를 수정하거나 정리해 주나요?
아니요. 읽고 프로파일만 만듭니다. 내려받거나 복사하는 프로파일은 열에 대한 보고서이고, 데이터를 고친 사본이 아닙니다.
헤더 행이 없는 파일도 볼 수 있나요?
네. "첫 행은 헤더"를 끄세요. 모든 레코드를 데이터로 보고 열 이름은 column_1, column_2처럼 붙습니다.
마지막 업데이트:
