CSV 열이 밀렸다면, 쉼표·줄바꿈 따옴표부터 확인하세요

·

CSV가 한글 깨짐 없이 열리는데도 주소가 든 행부터 열이 옆으로 밀리거나, 메모가 든 뒤부터 새 행이 생긴다면 인코딩 문제가 아니라 CSV의 필드 경계가 깨진 문제일 가능성이 큽니다. 쉼표·줄바꿈·큰따옴표가 값에 들어갈 때는 그 값 전체를 큰따옴표로 감싸고, 값 안의 큰따옴표는 두 번 써야 합니다. 원본을 복사한 뒤 이 규칙을 확인하고, Excel 가져오기 미리보기에서 모든 레코드가 헤더와 같은 수의 열로 보이는지 확인하세요.

인코딩 문제와 구조 문제는 다릅니다

글자가 깨지면 문자 인코딩을 의심할 수 있습니다. 반면 한글은 읽히는데 특정 주소 뒤부터 값이 다음 열로 가거나, 긴 메모가 다음 행으로 갈라지면 구분자와 인용 부호를 먼저 봐야 합니다. RFC 4180의 공통 형식은 한 레코드가 같은 필드 수를 가지며, 쉼표·줄바꿈·큰따옴표를 포함한 필드는 큰따옴표로 감싸는 방식을 설명합니다. 다만 이 문서는 모든 프로그램의 설정을 강제하지 않으므로, 수신 시스템이 별도 규칙을 요구한다면 그 규칙도 확인해야 합니다.

큰따옴표가 있는 CSV와 없는 CSV의 열 분리 차이
RFC 4180식 CSV에서는 값 안의 쉼표가 큰따옴표 안에 있을 때 열 구분자로 처리되지 않는다.

세 가지 값으로 깨진 위치 찾기

아래 예제는 헤더를 포함해 늘 세 열(이름, 주소, 메모)이어야 합니다. 코드 블록의 줄바꿈은 파일에 실제로 들어가는 문자입니다.

주소 안에 쉼표가 있을 때

정상 파일에서는 주소 전체를 큰따옴표로 감쌉니다.

이름,주소,메모
민지,"서울시 중구, 세종대로 1",방문 예정

다음처럼 따옴표가 없으면 쉼표 뒤의 ‘세종대로 1’이 세 번째 열로 들어가고, 원래 메모는 네 번째 열로 밀립니다.

이름,주소,메모
민지,서울시 중구, 세종대로 1,방문 예정

메모 안에 줄바꿈이 있을 때

줄바꿈 자체가 오류는 아닙니다. 여는 큰따옴표와 닫는 큰따옴표 사이에 있으면 같은 필드의 일부입니다. 텍스트 편집기에서 두 줄로 보인다고 두 행이라고 세면 안 됩니다.

이름,주소,메모
민지,서울시 중구,"오전 연락
부재 시 문자"

메모 앞의 여는 따옴표나 끝의 닫는 따옴표가 빠지면, 읽는 프로그램은 줄바꿈부터 새 레코드로 해석할 수 있습니다. 이때는 가져오기 옵션을 바꿔 맞추기보다 누락된 따옴표가 왜 생겼는지 원본 생성 시스템에서 확인해 다시 내보내는 편이 안전합니다.

값 안에 큰따옴표가 있을 때

값 안의 큰따옴표는 백슬래시를 붙이는 방식이 아니라 큰따옴표를 두 번 써서 나타냅니다.

이름,주소,메모
민지,서울시 중구,"상태는 ""보류""로 기록"

이 규칙은 인용 필드 안의 큰따옴표를 두 개로 표현하는 RFC 4180의 예와, 쉼표·줄바꿈을 포함한 인용 필드를 하나의 필드로 읽어야 한다는 GNU의 CSV 처리 설명에 맞습니다.

원본을 덮어쓰지 않고 확인하는 순서

  1. CSV 파일을 복사해 작업본을 만듭니다. 이미 Excel에서 저장했다면 그 파일로 원본을 대체하지 말고, 처음 받은 CSV를 따로 보관합니다.
  2. 작업본을 텍스트 편집기로 열고 열이 처음 밀리는 레코드의 앞을 찾습니다. 쉼표가 든 주소·메모가 큰따옴표로 시작하고 끝나는지, 필드 안의 큰따옴표가 ""인지 확인합니다.
  3. 줄바꿈이 보이면 바로 다음 줄을 새 행으로 세지 않습니다. 앞선 여는 큰따옴표가 닫히기 전이면 같은 메모 필드입니다. 닫힌 뒤에만 다음 레코드가 시작합니다.
  4. Excel에서는 파일을 더블클릭하지 말고 데이터 > 텍스트/CSV에서 불러옵니다. 구분자를 확인하고 미리보기에서 헤더와 각 레코드가 같은 세 열로 나뉘는지 봅니다. Microsoft의 텍스트/CSV 가져오기 안내도 이 경로에서 구분자를 선택하고 결과를 미리보기로 확인하도록 안내합니다.
  5. 미리보기에서 특정 레코드만 네 열 이상이거나 메모가 다음 행으로 분리되면, Excel에 가져오지 말고 작업본의 해당 인용 부호를 다시 봅니다. 모든 레코드가 같은 열 수로 보일 때만 가져옵니다.

이 검산은 쉼표 개수를 기계적으로 세는 일이 아닙니다. 큰따옴표 밖의 쉼표만 열 경계로 세고, 큰따옴표 안의 쉼표와 줄바꿈은 값으로 남겨야 합니다.

가져오기 설정으로 해결되는 경우와 아닌 경우

파일 자체는 정상인데 Excel이 다른 구분자를 적용한 경우에는 텍스트/CSV 가져오기에서 구분자를 바로잡고 미리보기를 확인하면 됩니다. 반면 주소 값을 감싸는 따옴표가 없거나 줄바꿈 메모의 닫는 따옴표가 빠졌다면, 구분자 선택만으로 원래 열 경계를 되살릴 수 없습니다.

레거시 텍스트 가져오기 마법사를 사용할 수 있는 환경이라면 텍스트 한정자를 큰따옴표로 두고, 따옴표 사이 쉼표가 한 셀로 남는지 미리보기에서 확인할 수 있습니다. 다만 이 기능은 깨진 닫는 따옴표를 고치는 도구가 아니라 해석 결과를 확인하는 도구입니다. Microsoft의 Text Import Wizard 설명도 이 구분을 보여 줍니다.

열 수가 맞아도 앞자리 0이나 긴 식별자가 바뀔 수 있습니다. 그 문제까지 함께 막으려면 엑셀 CSV 한글 깨질 때, 더블클릭 대신 가져오기에서 가져오기 과정의 열 형식 확인도 이어서 보세요.

참고 자료

  1. IETF, 「RFC 4180: Common Format and MIME Type for CSV Files」
  2. Microsoft Support, 「Import or export text (.txt or .csv) files」
  3. Microsoft Support, 「Text Import Wizard」
  4. GNU, 「Comma Separated Fields」