Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 엑셀에서 CSV 저장 시 구분 문자(세미콜론/콤마)가 잘못 적용되어 시스템 간 호환성 문제가 발생할 때, 원인 진단부터 윈도우·맥 설정, 엑셀 옵션, 자동화 스크립트(VBA·PowerShell·Python)까지 현장에서 바로 쓸 수 있는 해결책을 체계적으로 제공하는 것이다.
CSV는 단순 텍스트 파일이며 열 구분자로 일반적으로 콤마(,)를 사용하나, 일부 지역 설정에서는 세미콜론(;)을 사용한다. 엑셀은 저장 시 운영체제의 지역 설정에 정의된 리스트 구분 기호를 따르는 구조로 동작하는 경우가 많다. 특히 소수점 기호가 ,인 환경에서는 충돌을 피하기 위해 ;를 구분자로 쓰는 관행이 널리 쓰인다. 결과적으로 같은 파일이라도 PC마다 다른 구분자로 저장되는 문제가 발생한다.
| 증상 | 가능 원인 | 핵심 레버(해결 지점) |
|---|---|---|
| CSV 저장 시 세미콜론으로 저장됨 | Windows 지역 형식의 리스트 구분 기호가 ; | Windows 고급 형식의 리스트 구분 기호를 ,로 변경 |
| CSV 저장 시 콤마로 저장됨 | 리스트 구분 기호가 , 또는 Excel 기본 동작 | 타 시스템 요구가 ;라면 내보내기 도구로 변환 |
| 숫자·날짜가 깨져 보임 | 소수점·천 단위 구분과 CSV 구분자가 충돌 | 소수점 기호·리스트 구분 기호 조합을 재설계하거나 스크립트로 안전 변환 |
;→, 바꾸기)은 따옴표로 감싼 데이터 내부의 기호까지 바꿔 데이터 훼손이 발생한다. 반드시 CSV 파서를 사용하는 도구로 변환하라., 또는 ; 중 무엇을 요구하는지 사양서로 확정한다., 또는 ;)로 변경한다.CSV 파서를 사용해 구분자를 안전하게 변환한다. 따옴표, 줄바꿈, 이스케이프를 정확히 처리한다.
# PowerShell 5+ 권장. 원본이 세미콜론일 때 콤마로 변환 예시 Import-Csv -Path "input_semicolon.csv" -Delimiter ';' | Export-Csv -Path "output_comma.csv" -Delimiter ',' -NoTypeInformation -Encoding UTF8 -UseQuotes AsNeeded 반대로 콤마→세미콜론 변환은 -Delimiter 두 인자를 교차하면 된다.
# 폴더 내 모든 *.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 } 엑셀 for Mac은 시스템 숫자 구분 기호 설정의 영향을 받는다. 소수점이 ,인 환경에서는 엑셀이 CSV 구분자로 ;를 선택하는 경우가 일반적이다.
.)과 쉼표(,) 조합으로 설정한다.리스트 구분 기호와 무관하게 원하는 구분자를 강제하는 내보내기 매크로이다. 범용 파서 호환을 위한 따옴표 규칙을 포함한다.
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)만 대상으로 하라.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 # 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 미포함 =TEXT(A2,"yyyy-mm-dd") =TEXT(A2,"000000") =TEXT(A2,"0.########") | 항목 | 체크 방법 | 도구 |
|---|---|---|
| 구분자 일치 | 첫 줄 샘플 확인 | 전용 파서(Import-Csv, pandas.read_csv) |
| 열 개수 정상 | 모든 행의 필드 수 동일 | 파서로 로드 후 컬럼 카운트 |
| 문자 인코딩 | 상대 시스템 요구와 일치 | UTF-8(BOM/무BOM) 점검 |
| 따옴표 이스케이프 | " 포함 데이터 정상 복원 | 파서 기반 역직렬화 |
| 줄바꿈 내포 | 셀 내부 개행 보존 | 따옴표 감싸기 존재 확인 |
Import-Csv ".\in.csv" -Delimiter ';' | Export-Csv ".\out.csv" -Delimiter ',' -NoTypeInformation -Encoding UTF8 -UseQuotes AsNeeded (Import-Csv ".\out.csv" -Delimiter ',').Count ,로 표준화한다.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) ISTEXT, ISNUMBER로 검사한다.=SUM(--ISNUMBER(SEARCH(",",A:A))) 상대가 보낸 CSV를 엑셀로 열 때 구분자가 맞지 않아 한 열로 뭉치면 다음 절차를 따른다.
, 또는 ;로 지정한다.엑셀의 CSV 저장은 운영체제 지역 설정의 리스트 구분 기호 영향을 받을 수 있다. 파일 포맷 이름에 “쉼표”가 포함되어 있어도 시스템 설정에 따라 결과가 달라질 수 있다. 요구가 명확하면 PowerShell/Python으로 구분자를 강제하라.
권장하지 않는다. 따옴표로 감싼 필드 내부의 기호까지 바뀌어 데이터가 변조된다. CSV 파서를 사용하라.
엑셀은 BOM 포함 UTF-8을 주로 생성한다. 필요한 경우 파이썬이나 PowerShell로 BOM 없는 UTF-8로 재저장하라.
충돌 위험이 높다. 세미콜론을 구분자로 쓰거나, 모든 숫자를 문자열로 고정해 충돌을 회피하라.
신뢰할 수 있는 게시자로 서명하거나 신뢰할 수 있는 위치에서 실행하라. 조직 정책을 따른다.