공급사 재고 CSV를 직전 익스포트와 대조
공급사가 매주 새 가격표를 보냅니다. 지난주 파일은 왼쪽 패널에, 이번 주 파일은 오른쪽에 떨어뜨리면 SKU 단위 가격 변동이 한눈에 들어와, Excel에서 4,000행을 어느 셀이 노란색이 되었나 찾아가며 스크롤할 필요가 없습니다. 두 번째 시트에 대한 VLOOKUP으로 Excel에서 처리하는 것도 가능하지만 느립니다. 새 가격을 매장에 반영하기 전 빠른 점검이라면 diff가 더 빠릅니다.
두 CSV 파일을 붙여넣거나 업로드하면 변경된 행, 가격, 필드를 나란히 보여줍니다. 브라우저에서 동작, 가입 없음, 업로드 없음.
두 CSV 파일을 비교하기 위한 무료 브라우저 내 도구입니다. 어제의 공급사 출력 파일을 왼쪽에, 오늘 것을 오른쪽에 붙여 넣으면 바뀐 셀이 강조됩니다. 어떤 것도 기기 밖으로 나가지 않습니다. 계정도, 업로드도, 할당량도 없습니다.
diff 자체는 문자 단위이며, 콤마 사이에 강조 표시를 흩뿌리지 않고 필드 값 전체로 모아 주는 의미적 후처리 단계가 함께 작동합니다. 이 도구가 가정하는 문법은 사실상의 CSV 표준 RFC 4180입니다. 콤마로 구분된 필드, 선택적 큰따옴표, 리터럴 따옴표를 이스케이프하기 위한 따옴표 두 번, CRLF 줄 끝.
8,000행짜리 공급사 가격표 두 개를 Excel에서 열어, 가격이 움직인 SKU를 찾으려고 열을 따라 스크롤하다가 포기한 적이 있다면, 이 도구는 몇 초 안에 변화 지점까지 데려다 줍니다. 자유 형식의 산문이라면 텍스트 diff 도구를 사용하세요. 안정적인 키가 있는 구조화된 데이터라면 JSON diff가 객체 재정렬을 CSV보다 훨씬 잘 처리합니다. XML diff는 더 오래된 ERP에서 나오는 레거시 데이터 익스포트에 적합합니다.
비교는 한 줄씩, 문자를 인지하며 이루어집니다. 삽입은 오른쪽에 초록색으로, 삭제는 왼쪽에 빨간색으로 나타납니다. 라인 모드 패스는 5MB 파일에서도 합리적인 성능을 유지하고, 이어지는 변경된 줄에 대한 문자 모드의 정밀화가 움직인 정확한 필드를 드러냅니다. 대부분의 스프레드시트 익스포트에서 터미널의 diff를 돌리는 것보다 빠르고 깔끔합니다.
이 도구가 무엇이 아닌지에 대해서도 솔직하자면, 진짜 행 키를 인식하는 비교가 아니라 텍스트 diff입니다. 다른 열 기준으로 정렬해서 행 순서를 바꾸면 실제 데이터가 같아도 모든 줄이 변한 것처럼 보입니다. 열을 재배열해도 마찬가지입니다. 여기에는 csvkit의 csvjoin이나 SKU에 대한 pandas merge가 제공하는 기본 키 개념이 없습니다. 붙여넣기 전에 두 파일을 같은 방식으로 정렬하거나, 진짜로 집합 기반 비교가 필요하면 그런 도구를 사용하세요.
헤더 행은 이 도구에는 데이터입니다. 1행도 다른 모든 행과 똑같이 다뤄지므로, 헤더 이름 변경은 맨 위의 한 줄 diff로 표시됩니다. 스키마 드리프트를 검토할 때는 보통 그게 원하는 동작입니다. 본문 행만 신경 쓰고 싶다면 붙여넣기 전에 양쪽에서 헤더를 제거하세요. CSV 형식 자체와 헤더 관습은 CSV 배경 문서와, CSV 리소스 안에서 셀 범위를 선택하기 위한 URI 프래그먼트를 정의한 RFC 7111에 설명되어 있습니다.
텍스트 패널 두 개, diff 하나. 가입도, 업로드도, 서버 왕복도 없습니다.
오래된 CSV는 왼쪽에, 더 최신인 것은 오른쪽에 붙여 넣으세요. 또는 어느 쪽이든 업로드를 클릭해 .csv, .tsv, .txt 파일을 디스크에서 바로 불러옵니다. 샘플 버튼은 두 패널을 작은 상품 가격표로 채워 도구가 어떻게 동작하는지 먼저 보여 줍니다.
Excel은 Windows에서 CSV를 CRLF(\r\n)로 저장합니다. Python의 csv.writer나 Unix 셸 파이프라인 같은 도구는 보통 LF(\n)를 씁니다. 한쪽이 CRLF고 다른 쪽이 LF면 모든 줄이 변한 것처럼 보입니다. 줄 끝이 일치하도록 붙여넣기 전에 둘 다 같은 에디터에서 열거나 dos2unix를 통과시키세요. Excel이 저장한 CSV의 시작 부분에 있는 UTF-8 BOM도 흔한 범인입니다. 다른 파일에 BOM이 없으면 제거하세요.
삭제는 왼쪽에 빨간색 강조, 삽입은 오른쪽에 초록색 강조로 표시됩니다. 한쪽을 스크롤하면 다른 쪽도 따라옵니다. 변경된 가격, 맨 아래에 추가된 새 행, 목록 중간에 정정된 이메일 주소를 찾으세요. 헤더 변경은 1행에 한 줄 diff로 나타납니다.
공급사가 매주 새 가격표를 보냅니다. 지난주 파일은 왼쪽 패널에, 이번 주 파일은 오른쪽에 떨어뜨리면 SKU 단위 가격 변동이 한눈에 들어와, Excel에서 4,000행을 어느 셀이 노란색이 되었나 찾아가며 스크롤할 필요가 없습니다. 두 번째 시트에 대한 VLOOKUP으로 Excel에서 처리하는 것도 가능하지만 느립니다. 새 가격을 매장에 반영하기 전 빠른 점검이라면 diff가 더 빠릅니다.
고객 덤프를 파트너에게 보내기 전에 PII를 가립니다. 이메일은 [email protected]으로, 전화는 마스킹, 전체 이름은 첫 글자만 남깁니다. 원본 익스포트와 정제된 사본을 diff하여 마스킹된 열 만 바뀌었음을 확인하세요. billing_address 열이 예기치 않게 diff에 나타난다면 마스킹 스크립트가 한 필드를 놓친 것이고, 파일이 노트북을 떠나기 전에 잡아낼 수 있습니다.
Google Merchant Center, Facebook Catalog, 그리고 대부분의 마켓플레이스는 CSV(또는 TSV) 피드를 받아들입니다. CMS가 피드를 재생성한 뒤 어젯밤의 정상 사본과 diff하면, price의 끝자리 0을 떼어 버린 정규식, IF() 버그로 모든 행의 가용성 열이 in_stock에서 out_of_stock으로 뒤집힌 사고, 또는 팀이 아무에게도 말 안 하고 추가한 새 GTIN 필드를 잡아낼 수 있습니다.
세일즈 운영 담당자가 "지난주 이후 어떤 연락처가 바뀌었나요?"라고 물어보면, 같은 보고서를 두 번(그때와 지금) 익스포트해서 두 파일을 diff합니다. CSV는 기본적으로 레코드 ID 순으로 정렬되어 있지 않으므로, 먼저 두 쪽 모두 ID 열로 정렬하세요. 그렇지 않으면 모든 행이 뒤섞인 것처럼 보입니다. 정렬 후에는 진짜 변경(리드 상태가 MQL에서 SQL로 이동, 바운스 후 정정된 이메일)이 명확하게 드러납니다.
야간 ETL 작업이 S3에 CSV를 씁니다. 오늘 행 수가 어제와 의심스럽게 다릅니다. 두 파일을 가져와 diff하면 스키마 드리프트가 보입니다. 상류 API가 필드를 추가해서 테이블 중간에 새 열이 생겼고, 그 결과 하류의 모든 셀이 한 칸씩 밀렸던 것이죠. diff는 구조 변화를 즉시 잡아내는 반면, 단순한 행 수 검사는 뭔가 어긋났다는 사실만 알려 줄 뿐입니다.
데이터 사이언티스트가 실험 결과를 담은 CSV를 보내옵니다. 방법론을 살짝 손보고 분석을 다시 돌립니다. v1과 v2를 diff하세요. 검정 통계량 열만 변했을까요, 아니면 할당 수도 움직였을까요(즉, 코호트 정의가 움직였다는 뜻일 수 있습니다)? 결과에 기반해 기능을 출시하기 전에, 분석 출력의 정직한 diff는 가장 저렴한 점검입니다.
이 도구가 가장 자주 드러내는 파싱 경계 사례를 위한 짧은 치트시트. 문법 참조는 RFC 4180 + 실제 스프레드시트 도구가 실제로 내보내는 것입니다.
| Topic | What this tool does |
|---|---|
| RFC 4180에 따른 따옴표 | 콤마, 큰따옴표, 줄바꿈을 포함하는 필드는 큰따옴표로 감싸야 합니다. "Widget, small"은 한 필드입니다. 4.99 같은 평문 값은 따옴표가 필요 없습니다. RFC 4180 참조. |
| 이스케이프된 큰따옴표 | 큰따옴표로 감싼 필드 안의 리터럴 "는 두 개로 겹쳐 이스케이프합니다. "He said ""hi"""의 값은 He said "hi"입니다. 일부 도구가 받아들이긴 해도 백슬래시 이스케이프는 표준 CSV가 아닙니다. |
| 내장된 줄바꿈 | RFC 4180에 따르면 큰따옴표로 감싼 필드 안의 줄바꿈은 허용됩니다. 한 셀 안의 여러 줄 주소는 유효한 CSV입니다. diff는 각 물리적 줄을 한 단위로 다루므로, 줄바꿈을 품은 필드는 줄을 감싸는 줄에 변경 사항이 표시될 수 있습니다. |
| 줄 끝(CRLF 대 LF) | RFC 4180은 CRLF(\r\n)를 명시합니다. Excel은 CRLF를 출력합니다. 대부분의 Unix 도구는 LF를 출력합니다. 좌우 패널에서 둘을 섞으면 모든 줄이 변한 것처럼 보입니다. 비교 전에 줄 끝을 통일하세요. |
| BOM(UTF-8) | Excel이 저장한 CSV는 종종 UTF-8 BOM(EF BB BF)으로 시작합니다. 유니코드 BOM FAQ는 UTF-8에는 선택적이고 불필요하다고 표시합니다. 두 파일 사이의 BOM 불일치는 1행에 유령 diff를 만들어냅니다. |
| 구분자 방언 | 콤마가 기본값입니다. 많은 로케일에서 콤마가 소수점이라 유럽판 Excel은 세미콜론(;)으로 익스포트합니다. TSV(탭 구분)는 흔한 변종입니다. TSV 배경을 참조. 의미 있는 diff를 보려면 두 파일이 같은 구분자를 사용해야 합니다. |
| 헤더 행 | 이 도구는 1행을 데이터로 다룹니다. 열 이름 변경은 맨 위의 한 줄 diff로 나타납니다. 본문 행만 비교하고 싶다면 붙여넣기 전에 두 패널 모두에서 헤더를 제거하세요. Python의 csv.DictReader, pandas 등 대부분의 파서는 관습적으로 1행을 헤더로 다루지만, 파일 형식 자체는 그것을 요구하지 않습니다. |
| 인코딩 | 브라우저 내 FileReader를 통해서는 UTF-8만 지원됩니다. Latin-1(ISO-8859-1)과 Windows-1252는 로드는 되지만 악센트 문자가 깨져 보입니다. 붙여넣기 전에 iconv 또는 VS Code의 "Save with Encoding"으로 변환하세요. |
네. 엔진은 한 줄씩 문자를 비교하므로, 행이나 열을 재정렬하면 실제 데이터가 같아도 차이로 표시됩니다. 이것은 CSV를 의식한 몇 가지 읽기 보조가 더해진 텍스트 diff입니다. 행 키 매칭, 열 재정렬 인지, 타입에 대한 의미적 이해는 없습니다. 그 정도의 비교가 필요하다면 csvkit, 기본 키 기준 merge가 있는 pandas 같은 도구를 쓰거나, 두 파일을 SQLite에 적재해 EXCEPT 쿼리를 돌리세요. 일상적인 스프레드시트 비교라면 이 도구로 대부분 처리됩니다.
Excel은 CSV를 CRLF(\r\n)로 쓰고, Python의 csv.writer는 보통 LF(\n)를 쓰며, 셸 파이프라인은 플래그에 따라 둘 다 만들어 낼 수 있습니다. 한 패널이 CRLF이고 다른 쪽이 LF면 diff는 모든 줄에서 차이를 봅니다. 해결책은 붙여넣기 전에 양쪽을 정규화하는 것입니다. 같은 에디터에서 열고 한 가지 줄 끝으로 저장하거나, 한쪽을 dos2unix나 unix2dos에 통과시키세요. RFC 4180은 CRLF를 의무화하지만, 실제 CSV 파일은 둘 다 사용합니다.
아니요. 이건 한 줄씩의 텍스트 diff입니다. 1행의 열 순서가 왼쪽은 sku,name,price이고 오른쪽은 name,sku,price면, diff는 열 모델이 아닌 원시 텍스트를 보기 때문에 모든 줄의 모든 셀이 변한 것처럼 보입니다. 두 파일을 서로 다른 열 기준으로 정렬해도 마찬가지입니다. diff 전에 열과 행 순서를 맞추거나, 열 모델이 정말 중요할 때는 csvkit의 csvjoin이나 pandas의 merge처럼 행 키를 인식하는 도구를 쓰세요.
Windows의 Excel은 종종 CSV 시작에 UTF-8 바이트 순서 표식(EF BB BF 바이트)을 씁니다. 유니코드 BOM FAQ는 UTF-8에는 불필요하다고 말하지만요. 한 파일에 BOM이 있고 다른 파일에는 없으면 1행 1열에 한 글자짜리 유령 diff가 보입니다. 제대로 된 텍스트 에디터(VS Code, Notepad++, Sublime)로 파일을 열어 BOM 없이 다시 저장하거나, 붙여넣기 전에 처음 3바이트를 손으로 잘라내세요.
FileReader 경로가 여기서 올바르게 디코딩하는 유일한 인코딩은 UTF-8입니다. Latin-1이나 Windows-1252 파일은 로드는 되지만 악센트가 있는 문자는 깨져 보입니다(예: café가 café로). BOM이 있는 UTF-16은 완전히 망가져 보입니다. UTF-8이 아닌 파일은 먼저 변환하세요. 터미널에서는 iconv -f WINDOWS-1252 -t UTF-8 input.csv > out.csv, VS Code에서는 "Reopen with Encoding" 후 "Save with Encoding"으로 UTF-8을 선택하세요. Python의 csv 모듈과 pandas 모두 읽을 때 원본 인코딩을 지정할 수 있습니다.
몇 MB까지는 괜찮고 즉시처럼 느껴집니다. 10MB가 넘으면 브라우저가 부담을 느끼기 시작하는데, 비용의 대부분은 diff를 계산하는 게 아니라 강조 표시를 렌더링하는 것입니다. 매우 큰 익스포트(50MB+)라면 두 파일을 정말로 관심 있는 열이나 행으로 먼저 좁히세요. csvkit의 csvcut과 csvgrep, JSON으로 변환한 CSV에 쓰는 jq, 빠른 awk/grep 등 모두 좋은 전처리입니다. 그런 다음 잘라낸 조각을 여기에 붙여 넣으세요.
CSV는 결코 브라우저를 떠나지 않습니다. 리더, diff, 렌더링 모두 사용자 기기 위에서 로컬로 동작합니다. 입력에 대한 분석도, 로그도, "친절한" 클라우드 왕복도 없습니다. 확인하려면 DevTools를 열고 Network 탭으로 전환해 지켜보세요. 비교할 때 외부로 나가는 요청은 없습니다. 형식 참조는 RFC 4180이며, 파싱 경계 사례는 Python의 csv 모듈 문서를 기준으로 교차 확인합니다.