- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 CSV 저장 시 구분 문자(세미콜론/콤마)가 잘못 적용되어 시스템 간 호환성 문제가 발생할 때, 원인 진단부터 윈도우·맥 설정, 엑셀 옵션, 자동화 스크립트(VBA·PowerShell·Python)까지 현장에서 바로 쓸 수 있는 해결책을 체계적으로 제공하는 것이다.
왜 CSV 구분자가 바뀌어 저장되는가
CSV는 단순 텍스트 파일이며 열 구분자로 일반적으로 콤마(,)를 사용하나, 일부 지역 설정에서는 세미콜론(;)을 사용한다. 엑셀은 저장 시 운영체제의 지역 설정에 정의된 리스트 구분 기호를 따르는 구조로 동작하는 경우가 많다. 특히 소수점 기호가 ,인 환경에서는 충돌을 피하기 위해 ;를 구분자로 쓰는 관행이 널리 쓰인다. 결과적으로 같은 파일이라도 PC마다 다른 구분자로 저장되는 문제가 발생한다.
| 증상 | 가능 원인 | 핵심 레버(해결 지점) |
|---|---|---|
| CSV 저장 시 세미콜론으로 저장됨 | Windows 지역 형식의 리스트 구분 기호가 ; | Windows 고급 형식의 리스트 구분 기호를 ,로 변경 |
| CSV 저장 시 콤마로 저장됨 | 리스트 구분 기호가 , 또는 Excel 기본 동작 | 타 시스템 요구가 ;라면 내보내기 도구로 변환 |
| 숫자·날짜가 깨져 보임 | 소수점·천 단위 구분과 CSV 구분자가 충돌 | 소수점 기호·리스트 구분 기호 조합을 재설계하거나 스크립트로 안전 변환 |
;→, 바꾸기)은 따옴표로 감싼 데이터 내부의 기호까지 바꿔 데이터 훼손이 발생한다. 반드시 CSV 파서를 사용하는 도구로 변환하라.빠른 해결 순서도
- 요구 구분자 확인 : 대상 시스템이
,또는;중 무엇을 요구하는지 사양서로 확정한다. - 일회성 내보내기 : PowerShell 또는 Python으로 정확한 구분자 변환을 수행한다.
- 상시 표준화 : Windows 리스트 구분 기호 또는 macOS 숫자 구분 설정을 표준 구분자 전략에 맞춘다.
- 엑셀 자동화 : VBA 내보내기 매크로로 팀 공통 툴을 만든다.
Windows에서 구분자 강제하기
1) 시스템 리스트 구분 기호 변경
- 제어판 → 시계 및 국가 → 국가 → 형식 → 추가 설정을 연다.
- 목록 구분 기호를 요구 구분자(
,또는;)로 변경한다. - 확인 후 엑셀을 재시작하고 저장한다.
2) 파일별 안전 변환(PowerShell 권장)
CSV 파서를 사용해 구분자를 안전하게 변환한다. 따옴표, 줄바꿈, 이스케이프를 정확히 처리한다.
# PowerShell 5+ 권장. 원본이 세미콜론일 때 콤마로 변환 예시 Import-Csv -Path "input_semicolon.csv" -Delimiter ';' | Export-Csv -Path "output_comma.csv" -Delimiter ',' -NoTypeInformation -Encoding UTF8 -UseQuotes AsNeeded 반대로 콤마→세미콜론 변환은 -Delimiter 두 인자를 교차하면 된다.
3) Excel 없이 배치 처리
# 폴더 내 모든 *.csv 세미콜론→콤마 Get-ChildItem -Path "C:\data" -Filter *.csv | ForEach-Object { $in = $_.FullName $out = [System.IO.Path]::ChangeExtension($in, ".comma.csv") Import-Csv $in -Delimiter ';' | Export-Csv $out -Delimiter ',' -NoTypeInformation -Encoding UTF8 -UseQuotes AsNeeded } macOS에서 구분자 제어하기
엑셀 for Mac은 시스템 숫자 구분 기호 설정의 영향을 받는다. 소수점이 ,인 환경에서는 엑셀이 CSV 구분자로 ;를 선택하는 경우가 일반적이다.
- 시스템 설정 → 언어 및 지역 → 고급 → 숫자 구분을 점(
.)과 쉼표(,) 조합으로 설정한다. - 요구 구분자에 맞게 엑셀 저장 후 결과를 점검한다.
엑셀만으로 해결하는 방법
옵션 기반 저장 규칙
- CSV(쉼표로 분리)나 CSV UTF-8(쉼표로 분리) 형식은 시스템 설정의 영향을 받을 수 있다. 결과가 기대와 다르면 스크립트 기반 변환으로 보정한다.
- CSV는 서식·수식이 손실되는 형식이다. 저장 전 값 고정, 텍스트 서식 강제, 날짜 ISO8601(YYYY-MM-DD) 표준화가 안전하다.
VBA로 정확한 내보내기
리스트 구분 기호와 무관하게 원하는 구분자를 강제하는 내보내기 매크로이다. 범용 파서 호환을 위한 따옴표 규칙을 포함한다.
Option Explicit
' 시트의 UsedRange를 원하는 구분자로 CSV 내보내기
Public Sub ExportCsvWithDelimiter()
Dim delim As String: delim = "," ' 필요 시 ";" 로 변경
Dim f As Integer, r As Long, c As Long
Dim ws As Worksheet, rng As Range, arr, line As String
Dim path As String: path = ThisWorkbook.Path & "\export_custom.csv"
Set ws = ActiveSheet
Set rng = ws.UsedRange
f = FreeFile
Open path For Output As #f
arr = rng.Value
For r = 1 To UBound(arr, 1)
line = ""
For c = 1 To UBound(arr, 2)
line = line & IIf(c > 1, delim, "") & QuoteCsv(arr(r, c), delim)
Next c
Print #f, line
Next r
Close #f
MsgBox "done: " & path, vbInformation
End Sub
Private Function QuoteCsv(ByVal v As Variant, ByVal delim As String) As String
Dim s As String: s = CStr(v)
Dim need As Boolean
need = (InStr(s, """") > 0) Or (InStr(s, vbLf) > 0) Or (InStr(s, vbCr) > 0) _
Or (InStr(s, delim) > 0)
If InStr(s, """") > 0 Then s = Replace(s, """", """""")
If need Then s = """" & s & """"
QuoteCsv = s
End Function
UsedRange에는 숨김 열·행이나 보조열이 포함될 수 있다. 내보내기 전 범위를 명시적으로 지정하거나 테이블(ListObject)만 대상으로 하라.테이블(ListObject)만 내보내기
Public Sub ExportListObject(ByVal tableName As String, ByVal delim As String) Dim lo As ListObject Set lo = ActiveSheet.ListObjects(tableName) Dim rng As Range: Set rng = lo.Range ' 위 ExportCsvWithDelimiter의 로직을 재사용하여 rng만 내보내면 된다. End Sub 대량 변환 파이프라인 예시
Python(pandas)로 구분자 변경
# pip install pandas 필요 import pandas as pd
df = pd.read_csv("input.csv", sep=";") # 원본 구분자
df.to_csv("output.csv", sep=",", index=False) # 목표 구분자
인코딩 표준화까지 수행
상대 시스템이 BOM 없는 UTF-8을 요구하면 다음과 같이 저장한다.
df.to_csv("output_utf8nobom.csv", sep=",", index=False, encoding="utf-8") # BOM 미포함 숫자·날짜 데이터 보호 전략
- 날짜는 저장 전 ISO8601 문자열로 변환한다.
=TEXT(A2,"yyyy-mm-dd") - 선행 0이 필요한 코드·ID는 텍스트 서식으로 강제한다.
=TEXT(A2,"000000") - 소수점은 시스템 소수점 기호와 CSV 구분자의 충돌을 피하도록 포맷을 고정한다.
=TEXT(A2,"0.########")
품질 점검 체크리스트
| 항목 | 체크 방법 | 도구 |
|---|---|---|
| 구분자 일치 | 첫 줄 샘플 확인 | 전용 파서(Import-Csv, pandas.read_csv) |
| 열 개수 정상 | 모든 행의 필드 수 동일 | 파서로 로드 후 컬럼 카운트 |
| 문자 인코딩 | 상대 시스템 요구와 일치 | UTF-8(BOM/무BOM) 점검 |
| 따옴표 이스케이프 | " 포함 데이터 정상 복원 | 파서 기반 역직렬화 |
| 줄바꿈 내포 | 셀 내부 개행 보존 | 따옴표 감싸기 존재 확인 |
현장 시나리오별 처방
시나리오 A: 내 데이터는 세미콜론 CSV, 상대는 콤마만 허용
- 원본을 저장 그대로 유지한다.
- PowerShell로 안전 변환한다.
Import-Csv ".\in.csv" -Delimiter ';' | Export-Csv ".\out.csv" -Delimiter ',' -NoTypeInformation -Encoding UTF8 -UseQuotes AsNeeded - 검증:
(Import-Csv ".\out.csv" -Delimiter ',').Count
시나리오 B: 팀 전체가 항상 콤마를 쓰고 싶다
- Windows 리스트 구분 기호를
,로 표준화한다. - VBA 내보내기 매크로를 리포지토리에 공유하고 서명한다.
- CI 단계에서 파이썬 검증 스크립트로 열 수와 인코딩을 검사한다.
시나리오 C: 외주사 파일이 혼합 구분자이다
- 파일별 샘플 100행을 파이썬으로 읽어 자동 판별한다.
import pandas as pd, chardet from pathlib import Path for p in Path("drop").glob("*.csv"): try: df = pd.read_csv(p, sep=";") if df.shape[1] == 1: df = pd.read_csv(p, sep=",") print(p.name, df.shape) except Exception as e: print(p.name, "ERR", e) - 단일 표준으로 재내보내기한다.
업무 자동화를 위한 베스트 프랙티스
- 표준 정의 : 팀 문서에 구분자, 인코딩, 날짜 형식, 따옴표 규칙을 명문화한다.
- 검증 자동화 : PR 단계에서 CSV 린터로 열 수·구분자·인코딩을 검사한다.
- 양방향 어댑터 : PowerShell/Python 스크립트를 저장소에 포함해 양쪽 요구에 맞는 변환을 제공한다.
- UI 의존 최소화 : 엑셀의 지역 설정 의존 동작을 회피한다.
CSV 저장 전 사전 점검 팁
- 숫자 열은 텍스트가 섞여 있는지
ISTEXT,ISNUMBER로 검사한다. - 날짜는 지역 서식이 아닌 ISO 문자열로 고정한다.
- 필드 내 콤마·세미콜론·줄바꿈 포함 여부를 COUNTIF로 사전 파악한다.
=SUM(--ISNUMBER(SEARCH(",",A:A)))
엑셀 가져오기 단계에서의 역방향 처방
상대가 보낸 CSV를 엑셀로 열 때 구분자가 맞지 않아 한 열로 뭉치면 다음 절차를 따른다.
- 데이터 탭 → 텍스트/CSV에서 → 파일 선택.
- 원본 파일 형식과 구분 기호를 수동으로
,또는;로 지정한다. - 미리보기에서 열 분리가 정상인지 확인 후 로드한다.
현업용 요약
- 정책: 팀 표준 구분자와 인코딩을 문서화한다.
- 도구: PowerShell 또는 Python으로 안전 변환한다.
- 예외: 외부 요구가 다르면 어댑터로 대응한다.
- 검증: 파서 기반 자동 테스트를 배치한다.
FAQ
엑셀의 “CSV UTF-8”로 저장했는데도 구분자가 기대와 다르다. 왜 그런가?
엑셀의 CSV 저장은 운영체제 지역 설정의 리스트 구분 기호 영향을 받을 수 있다. 파일 포맷 이름에 “쉼표”가 포함되어 있어도 시스템 설정에 따라 결과가 달라질 수 있다. 요구가 명확하면 PowerShell/Python으로 구분자를 강제하라.
메모장으로 일괄 치환해도 되는가?
권장하지 않는다. 따옴표로 감싼 필드 내부의 기호까지 바뀌어 데이터가 변조된다. CSV 파서를 사용하라.
상대 시스템이 BOM 없는 UTF-8만 받는다. 엑셀이 지원하는가?
엑셀은 BOM 포함 UTF-8을 주로 생성한다. 필요한 경우 파이썬이나 PowerShell로 BOM 없는 UTF-8로 재저장하라.
소수점 기호가 콤마인 국가에서 콤마를 구분자로 쓰고 싶다.
충돌 위험이 높다. 세미콜론을 구분자로 쓰거나, 모든 숫자를 문자열로 고정해 충돌을 회피하라.
VBA 매크로 배포 시 보안 경고가 뜬다.
신뢰할 수 있는 게시자로 서명하거나 신뢰할 수 있는 위치에서 실행하라. 조직 정책을 따른다.