대용량 CSV · 실무 가이드
대용량 CSV 파일을 분할하는 방법
Excel에서 열리지 않거나 너무 느리고 공유하기 어려운 CSV는 목적에 맞게 나누면 다루기 쉬워집니다. Excel, Power Query, Python, LocaCSV의 차이와 특정 열의 값별로 안전하게 분할하는 절차를 정리했습니다.
결론: 분할 기준에 맞는 방법을 선택하세요
50MiB 이하 CSV는 LocaCSV에서 열 값, 지정 데이터 행 수 또는 목표 파일 크기를 기준으로 브라우저 안에서 최대 100개 파일로 나눌 수 있습니다.
50MiB 초과 입력, 여러 열을 조합한 키, 정기 자동 실행에는 로컬 Python 스크립트가 더 유연합니다. 큰 CSV를 Excel에서 직접 열어 복사·붙여넣기로 나누는 방식은 행 제한, 메모리 부족, 누락·중복 위험 때문에 파일이 클수록 권장하기 어렵습니다.
대용량 CSV가 열리지 않는 주요 원인
CSV는 텍스트 파일이지만 여는 프로그램에는 제한이 있습니다. Excel 워크시트는 최대 1,048,576행입니다. 이보다 많은 데이터는 한 시트에 담을 수 없습니다. 행 수가 제한보다 적어도 긴 셀, 많은 열, 형식 자동 판정, 메모리 부족, 잘못된 구분 기호 때문에 불러오기가 느려질 수 있습니다.
- Excel 워크시트의 최대 행 수를 초과했습니다.
- 파일을 메모리에 펼치는 과정에서 사용 가능한 메모리가 부족합니다.
- 구분 기호를 잘못 감지해 한 레코드가 비정상적으로 많은 열로 나뉩니다.
- 따옴표 안의 쉼표나 줄바꿈을 단순 분리해 행과 열 구조가 깨집니다.
- UTF-8, CP949 등 원본 문자 인코딩과 선택값이 달라 글자가 깨지거나 읽기에 실패합니다.
- Excel이 상품 코드, 앞자리 0, 긴 숫자, 날짜처럼 보이는 문자열을 자동 변환합니다.
Excel, Power Query, Python, LocaCSV 비교
어떤 도구가 적합한지는 분할 기준, 파일 크기, 반복 작업 여부, 코드 관리 가능 여부에 따라 달라집니다.
| 방법 | 적합한 상황 | 장점 | 주의점 |
|---|---|---|---|
| Excel | 비교적 작은 CSV를 눈으로 확인하며 한 번만 분할 | 익숙한 화면에서 확인하기 쉽습니다 | 1,048,576행 제한이 있고 큰 파일은 느리며 수작업에서 누락·중복이 생기기 쉽습니다 |
| Power Query | Excel에서 불러오기와 변환 절차를 재사용 | 원본을 직접 수정하지 않고 단계를 새로 고칠 수 있습니다 | 시트로 불러오면 행 제한이 남고 값별 CSV 여러 개를 내보내려면 추가 설계가 필요합니다 |
| Python | 50MiB 초과, 고정 행·용량, 정기 배치 | 스트리밍, 이름 규칙, 자동화를 세밀하게 제어할 수 있습니다 | 실행 환경, 코드, 테스트, 인코딩, 오류 처리를 직접 관리해야 합니다 |
| LocaCSV | 50MiB 이하 CSV를 값·행 수·목표 크기로 즉시 분할 | 가입·설치 없이 브라우저에서 처리하고 ZIP으로 받습니다 | 출력 최대 100개이며 값별 모드의 분할 열은 1개입니다 |
import csv
from pathlib import Path
source = Path("large.csv")
output_dir = Path("split")
output_dir.mkdir(exist_ok=True)
handles = {}
writers = {}
try:
with source.open("r", encoding="utf-8-sig", newline="") as input_file:
reader = csv.DictReader(input_file)
key_column = "department"
for row in reader:
key = row.get(key_column, "") or "(blank)"
if key not in writers:
output = output_dir / f"group-{len(writers) + 1:03d}.csv"
handle = output.open("w", encoding="utf-8-sig", newline="")
writer = csv.DictWriter(handle, fieldnames=reader.fieldnames)
writer.writeheader()
handles[key] = handle
writers[key] = writer
writers[key].writerow(row)
finally:
for handle in handles.values():
handle.close()LocaCSV로 분할하는 절차
쉼표, 큰따옴표, 이스케이프된 따옴표, 셀 내부 줄바꿈은 CSV 규칙에 따라 해석됩니다. 실행 전 미리보기에서 열이 정확히 맞는지 확인하는 것이 가장 중요합니다.
- CSV 분할 화면을 열고 CSV 파일 1개를 선택합니다.
- 헤더 유무, 입력 문자 인코딩, 구분 기호를 확인합니다. 미리보기의 열이 어긋나면 진행하지 않습니다.
- 분할 방법에서 열 값, 행 수 또는 목표 크기를 선택합니다.
- 값별 모드에서는 열과 빈 값 처리를, 다른 모드에서는 파일당 데이터 행 수 또는 목표 MiB를 지정합니다.
- 출력 인코딩, UTF-8 BOM 포함 여부, 출력 구분 기호를 확인하고 실행합니다.
- 입력 행, 출력·제외 행, 출력 파일 수, 경고를 확인한 뒤 ZIP을 다운로드합니다.
열의 값별로 분할하는 방법
값별 분할은 매장, 부서, 거래처, 월처럼 한 열의 분류값마다 별도 파일을 만드는 방식입니다. 예를 들어 ‘지점’ 열에 서울·부산·대구가 있으면 같은 값의 행이 각각 같은 CSV에 들어가 출력 3개가 만들어집니다.
헤더가 중복되거나 없거나 불필요한 공백이 있다면 미리보기와 1부터 시작하는 열 번호로 대상을 확인하세요. 값에 Windows 파일명으로 쓸 수 없는 문자가 있거나 예약어와 같아도 LocaCSV가 안전한 파일명으로 바꿉니다.
- 같은 값의 행은 같은 출력 파일에 들어갑니다.
- 빈 값은 제외하거나 별도 파일로 출력할 수 있습니다.
- 한 번에 선택할 수 있는 분할 열은 1개입니다.
- 고유 값이 100개를 넘으면 중지하며 부분 ZIP을 공개하지 않습니다.
- 완료 전에 ‘입력 행 수 = 출력 행 수 + 제외 행 수’를 검증합니다.
행 수와 파일 크기 주의점
CSV의 처리 난이도는 파일 크기만으로 결정되지 않습니다. 같은 50MiB라도 짧은 행이 수백만 개 있는 파일과 매우 긴 셀이나 따옴표 안 줄바꿈이 많은 파일은 필요한 메모리와 시간이 다릅니다.
LocaCSV Free의 단일 입력 제한은 한 파일 50MiB입니다. 기기 성능, 브라우저, CSV 구조, 출력량에 따라 제한보다 작은 파일도 처리하기 어려울 수 있습니다. 파일명만 바꾸거나 압축 파일을 넣어 제한을 우회할 수는 없습니다.
- 행 수 모드는 헤더를 제외한 데이터 행을 지정한 수만큼 나눕니다.
- 목표 크기는 출력 인코딩, BOM, 반복되는 헤더를 포함한 실제 바이트를 기준으로 합니다. 한 레코드만으로 목표를 넘으면 자르지 않고 단독 파일로 출력합니다.
- 모든 모드에서 출력은 최대 100개입니다.
- 원본을 덮어쓰지 말고 ZIP을 별도로 저장한 뒤 행 수를 확인하세요.
- Excel에서 열 목적이라면 각 출력이 1,048,576행 미만인지 확인하세요.
문자 인코딩과 한글 깨짐 해결
한국의 업무 CSV에는 UTF-8과 함께 CP949가 많이 사용되며, 오래된 시스템 문서에서는 EUC-KR이라는 표기도 자주 보입니다. LocaCSV에서는 CP949를 직접 선택할 수 있지만 EUC-KR은 별도 선택 항목이 아닙니다. EUC-KR 데이터의 많은 문자는 CP949 범위에 포함되지만, 미리보기에서 한글과 특수문자가 정확한지 반드시 확인하세요.
CP949로 올바르게 읽히지 않는 EUC-KR 파일은 먼저 로컬 도구에서 UTF-8 또는 CP949로 변환한 뒤 사용하세요. UTF-8 출력은 BOM 포함·제외를 선택할 수 있습니다. 선택한 출력 인코딩으로 표현할 수 없는 문자가 있으면 LocaCSV는 ‘?’로 몰래 바꾸지 않고 처리를 중지합니다.
- 미리보기에서 이름, 주소, 원화 기호, 괄호 문자, 특수문자를 확인합니다.
- 열이 밀리면 인코딩보다 먼저 쉼표, 세미콜론, 탭, 파이프 구분 기호를 확인합니다.
- 인코딩을 모르면 원본 시스템의 내보내기 설정을 확인합니다.
- 깨진 상태로 다시 저장해 원본을 덮어쓰지 말고 원본 파일부터 다시 시작합니다.
보안과 로컬 처리
LocaCSV의 CSV 처리는 브라우저 안의 Web Worker에서 실행됩니다. CSV 본문, 파일 이름, 헤더, 셀 값, 분할 값은 처리를 위해 외부 서버로 업로드되지 않습니다. 결과도 브라우저에서 만들고 다운로드 또는 초기화 후 보유 참조를 해제합니다.
공개 안내 사이트는 페이지 조회 파악을 위해 Cloudflare Web Analytics를 사용합니다. 처리 사이트는 광고·분석 SDK를 불러오지 않으며 기능, 용량 구간, 시간 구간, 고정 오류 코드처럼 제한된 식별자 없는 최소 사용 이벤트만 자사 전용 주소로 보냅니다. CSV 내용, 파일 이름, 정확한 용량, 행 수는 포함하지 않으며 전송 실패가 처리나 다운로드를 막지 않습니다.
기밀 자료라면 조직 규정, 기기 보안, 브라우저 확장 프로그램, 다운로드 폴더 권한도 함께 확인하세요. 브라우저 안에서 처리된다는 사실이 기기 전체의 안전을 자동으로 보장하는 것은 아닙니다.
대용량 CSV 분할 FAQ
Excel에서 열리지 않는 CSV도 분할할 수 있나요?
CSV가 50MiB 이하이고 지원하는 인코딩과 구분 기호를 지정할 수 있으며 출력이 100개 이하라면 열 값별로 분할할 수 있습니다. Excel 시트 행 제한을 넘는 CSV도 읽을 수 있지만 실제 처리 가능 범위는 기기와 CSV 구조에 따라 달라집니다.
10만 행 또는 10MB마다 분할할 수 있나요?
가능합니다. 행 수 모드는 헤더를 제외한 데이터 행을 세고, 목표 크기 모드는 0.1~50MiB와 출력 인코딩 후 실제 바이트를 사용합니다. 한 레코드는 중간에서 자르지 않으므로 그 레코드만 목표를 넘을 수 있습니다.
50MiB를 넘는 CSV도 사용할 수 있나요?
현재 공개된 Free 버전의 단일 입력 기능은 한 파일 최대 50MiB입니다. 더 큰 파일을 지원한다고 안내하지 않으므로 먼저 로컬에서 작게 나눠야 합니다.
CP949와 EUC-KR 파일은 어떻게 처리하나요?
CP949는 입력으로 직접 선택할 수 있습니다. EUC-KR은 별도 항목이 아니므로 CP949 미리보기에서 확인하고, 올바르게 보이지 않으면 로컬에서 UTF-8 또는 CP949로 변환한 뒤 사용하세요.
CSV 파일이 서버로 전송되나요?
CSV 본문, 파일 이름, 헤더, 셀 값, 분할 값은 처리를 위해 외부 서버로 업로드되지 않습니다. 분할과 ZIP 생성은 브라우저 안에서 실행됩니다.