엑셀에서 안 열리는 대용량 CSV 파일 여는 방법
Excel 워크시트는 최대 1,048,576행, 16,384열까지만 담을 수 있어서 300만 행짜리 파일은 그냥 들어가지 않아요. Excel은 앞부분만 불러오고 경고를 띄운 뒤 나머지는 버려요. 파일 전체를 보려면 CSV 뷰어처럼 이런 제한이 없는 도구로 열거나, 시트 대신 Excel의 데이터 모델로 불러오거나, 파일을 나누거나, Python이나 데이터베이스로 분석하세요.
Excel이 파일을 잘라 내는 이유
CSV 파일 자체에는 크기 제한이 없어요. 한 줄에 한 행, 쉼표나 세미콜론으로 구분된 값이 들어 있는 일반 텍스트일 뿐이에요(처음 들어 본다면 CSV 파일이란 무엇인지 먼저 보세요). 그런데 Excel은 여는 모든 것을 워크시트에 넣고, 워크시트에는 1,048,576행 × 16,384열(XFD열)이라는 고정된 격자가 있어요.
파일이 이 격자보다 크면 Excel은 파일을 완전히 불러오지 못했다는 경고를 보여 주고, 들어가는 행만 남겨요. 머리글과 데이터 1,048,575행까지만 들어가고, 1,048,577번째 행부터는 화면에서 사라져요.
Google Sheets도 해결책이 아니에요. 스프레드시트 하나당 모든 시트를 합쳐 1,000만 셀이라는 제한이 있어요. 300만 행 × 10열 파일이면 이미 3,000만 셀이라서 가져올 수 없어요.
진짜 위험: 저장하면 데이터가 사라져요
경고는 쉽게 닫아 버릴 수 있고, 화면에 남은 건 아무 문제 없어 보이는 표예요. 위험은 그다음에 와요.
- 파일을 저장할 때. Excel은 불러온 것만 다시 써요.
export.csv에서 저장을 누르면 원래 300만 행이 약 100만 행으로 바뀌고, 추가 경고도 없어요. - 합계를 낼 때. 잘린 시트에서
SUM이나 피벗 테이블로 계산하면 그럴듯해 보이지만 틀린 답이 나와요. 데이터의 3분의 2가 아예 들어오지 않았으니까요. - 공유할 때. 저장된 사본을 받은 동료는 행이 빠졌다는 걸 알 방법이 없어요.
Excel이 이미 경고를 보여 줬다면 저장하지 말고 파일을 닫은 다음, 원래 내보낸 파일은 손대지 말고 그대로 두세요. 그리고 실제로 얼마나 큰지 확인한 뒤에 어떻게 할지 정하세요.
방법 1: 브라우저에서 파일 전체 열기
레코드 몇 개를 확인하거나, 고객을 찾거나, 어떤 열에 무엇이 들어 있는지 보는 것처럼 주로 데이터를 보기만 하면 된다면, 격자 제한이 없는 뷰어가 가장 빨라요.
Opener CSV 뷰어는 브라우저에서 파일을 읽고 절대 업로드하지 않아요. 고객 정보나 금융 데이터가 들어 있는 파일이라면 중요한 점이죠. 파싱은 백그라운드 스레드에서 하고 화면에 보이는 행만 그리기 때문에, 20만 행짜리 파일이 1초 정도면 열리고 수백만 행짜리 파일도 일반 노트북에서 잘 열려요. 실제 한계는 정해진 행 수가 아니라 기기의 메모리예요.
열고 나면 이런 걸 할 수 있어요.
- 입력하는 대로 모든 열 검색하기
- 원하는 열로 정렬하기
- 필터와 정렬이 적용된 현재 보기를 깨끗한 UTF-8 CSV나 JSON으로 내보내기
마지막 기능은 유용한 요령이에요. 300만 행을 특정 지역이 들어간 4만 행으로 걸러서 내보내면, 작아진 파일은 Excel에서 경고 없이 열려요. 뷰어는 수식, 피벗, 차트를 실행하지 않아요. 그런 작업이 필요하다면 계속 읽어 보세요.
방법 2: Excel의 데이터 모델로 불러오기
최신 데스크톱 버전 Excel에서는 CSV를 직접 여는 대신 파워 쿼리(데이터 탭의 “데이터 가져오기” / “텍스트/CSV에서” 경로)로 가져올 수 있어요. 차이는 데이터가 어디로 가느냐예요.
결과를 워크시트에 불러오는 대신, 연결만 만들고 데이터 모델에 추가하도록 고르세요. 데이터 모델은 데이터를 격자 바깥에 압축된 형태로 저장하기 때문에 1,048,576행 제한을 받지 않아요. 그 위에 피벗 테이블을 만들면 월별 합계, 분류별 건수처럼 300만 행 전체를 요약할 수 있어요.
대신 일반 시트처럼 행을 스크롤해서 볼 수는 없고, 정확한 메뉴 이름은 Excel 버전마다 달라요. Excel 안에서 작업해야 하고 최종 결과가 행 단위 보기가 아니라 요약일 때 가장 좋은 방법이에요.
방법 3: 명령줄에서 세고, 미리 보고, 나누기
macOS, Linux, 또는 WSL이 있는 Windows에서는 몇 가지 표준 명령어로 파일을 어디에도 불러오지 않고 “얼마나 큰가?“와 “뭐가 들어 있나?“를 몇 초 만에 확인할 수 있어요.
wc -l export.csv # 줄 수
head -n 20 export.csv # 처음 20줄
head -n 100000 export.csv > sample.csv # 이것저것 시험해 볼 작은 샘플
wc -l은 행이 아니라 줄을 센다는 점에 주의하세요. 따옴표 안의 값에 줄바꿈이 들어 있으면(주소나 메모에 흔해요) 줄 수가 행 수보다 많게 나와요.
파일을 Excel에서 열 수 있는 크기로 나누고, 조각마다 머리글 행을 붙이려면 이렇게 하세요.
tail -n +2 export.csv | split -l 1000000 - part_
for f in part_*; do
{ head -n 1 export.csv; cat "$f"; } > "$f.csv" && rm "$f"
done
빠르게 확인하는 용도로는 나누기도 괜찮지만, 같은 따옴표 안 줄바꿈 문제를 조심하세요. split은 줄 단위로 자르기 때문에 여러 줄에 걸친 값을 반으로 쪼갤 수 있어요. 그리고 전체 합계가 필요하다면 통합 문서 네 개를 오가며 작업하는 건 번거로워요.
방법 4: pandas, SQLite, DuckDB로 분석하기
계산하고, 합치고, 집계해야 한다면 제대로 된 데이터 도구를 쓰는 게 정답이에요. 아래 도구들은 모두 일반 노트북에서 수천만 행을 처리해요.
Python과 pandas는 파일 전체를 메모리로 읽어요.
import pandas as pd
df = pd.read_csv("export.csv")
print(len(df))
print(df.groupby("region")["amount"].sum())
파일이 RAM보다 크다면 나눠서 읽으세요.
total = 0
for chunk in pd.read_csv("export.csv", chunksize=500_000):
total += chunk["amount"].sum()
DuckDB는 CSV 파일을 먼저 가져올 필요 없이 SQL로 바로 조회할 수 있어요.
SELECT region, COUNT(*) AS orders, SUM(amount) AS revenue
FROM 'export.csv'
GROUP BY region
ORDER BY revenue DESC;
SQLite는 많은 시스템에 설치되어 있고, 데이터를 조회 가능한 파일 하나로 보관하고 싶을 때 좋아요.
sqlite3 sales.db
sqlite> .mode csv
sqlite> .import export.csv sales
sqlite> SELECT COUNT(*) FROM sales;
무거운 작업은 여기서 하고, 몇천 행 정도의 요약 결과만 CSV로 다시 써서 Excel이나 보고서에 쓰는 흐름이 좋아요.
자주 묻는 질문
Excel의 행 제한을 늘릴 수 있나요?
아니요. 1,048,576행 제한은 모든 워크시트에 고정되어 있어요. 데이터 모델로 불러오거나, 파일을 나누거나, 다른 도구를 쓰는 식으로 우회할 수밖에 없어요.
파일이 잘렸는지 어떻게 알 수 있나요?
Excel은 파일을 열 때 경고를 보여 주고, 데이터가 정확히 1,048,576행에서 끝나는 시트라면 잘렸을 가능성이 아주 커요. 확실히 하려면 wc -l로 원본 파일 크기를 확인하거나, 전체 행 수를 보여 주는 CSV 뷰어로 열어 보세요.
Google Sheets나 LibreOffice로는 열리나요?
대개는 안 돼요. Google Sheets는 스프레드시트당 1,000만 셀이 한계이고, LibreOffice Calc도 시트당 최대 행 수가 정해져 있어요. 둘 다 작은 파일에는 괜찮지만, 수백만 행짜리 파일에는 뷰어, 데이터베이스, 스크립트가 필요해요.
대용량 고객 데이터를 브라우저 도구로 열어도 안전한가요?
도구에 따라 달라요. 많은 온라인 변환기는 파일을 서버로 업로드해요. Opener는 브라우저에서 파일을 로컬로 읽고 아무 데도 보내지 않기 때문에 데이터가 기기 안에 머물러요.