CSV 도우미English

CSV 금액의 1,234, 쉼표를 지우면 항상 맞을까요?

CSV 금액의 쉼표는 천 단위 구분자일 수도, 소수 구분자일 수도 있습니다. 파일 제공처의 숫자 형식과 통화를 확인하기 전에 쉼표를 일괄 삭제하지 마세요. CSV가 정상적으로 열려도 금액의 의미가 맞다는 보장은 없습니다.

원인: 열 구분자와 숫자 안 구분자는 다릅니다

CSV의 쉼표는 열을 나누는 문자로 쓰일 수 있지만, 큰따옴표로 감싼 필드 안의 쉼표는 값의 일부입니다. 예를 들어 "1,234.50"은 쉼표 CSV에서 하나의 값입니다. 문자 전체에서 쉼표를 삭제하면 열 경계까지 사라질 수 있습니다. Python CSV 공식 문서

또한 숫자를 표시하는 소수점·천 단위 구분자는 지역 설정과 별개 지정에 따라 달라질 수 있습니다. Excel도 기본적으로 시스템 구분자를 쓰며 이를 바꿀 수 있다고 안내합니다. 그러므로 ‘쉼표는 언제나 천 단위’라고 가정하면 안 됩니다. Microsoft 구분자 안내

재현: 형식이 섞인 합성 금액 5건

합성 금액 CSV는 record_id, amount_text, currency 세 열입니다. 실제 매출 자료가 아니며 통화는 모두 USD라는 예제 가정입니다. 환율이나 원화 환산은 다루지 않습니다.

순번amount_text 원문확인할 점
11,234.50점이 소수 구분자·쉼표가 천 단위라면 1234.50
22,000.00같은 형식이면 2000.00
31.234,50쉼표가 소수 구분자인 다른 형식일 수 있음. 앞 두 행의 규칙으로 변환하지 않음
41,2341234 또는 소수 1.234 등 해석이 갈림. 제공처 규칙과 소수자리 확인 필요
5(빈칸)금액 미확인.0원으로 확정하지 않음

표의 ‘빈칸’은 설명용이며 CSV에는 빈 문자열로 들어 있습니다. 통화 코드만 알아도 숫자 표기 형식까지 자동 결정되는 것은 아닙니다.

해결: 제공처 규칙을 확인하고 맞는 값만 별도 합계

먼저 원본을 복사하고 제공처에 소수 구분자·천 단위 구분자·통화·소수자리 규칙을 확인하세요. 다음 예제는 제공처가 ‘점 소수점, 쉼표 천 단위, 소수 두 자리 필수, 음수 없음’이라고 확인했다고 가정한 검증입니다. 다른 표기가 모두 잘못된 숫자라는 뜻은 아닙니다. 이 예제의 합의 형식과 다른 값은 자동 추측하지 않고 확인 대상으로 남깁니다.

예제 파일과 같은 폴더에서 실행합니다. 형식을 먼저 검사하고, 허용된 필드 안의 천 단위 쉼표만 제거합니다. 원본 파일을 수정하지 않습니다.

import csv
import re
from decimal import Decimal

pattern = re.compile(r'(?:0|[1-9][0-9]*|[1-9][0-9]{0,2}(?:,[0-9]{3})+)\.[0-9]{2}')
with open('guide-14-amount-separators.csv', encoding='utf-8-sig', newline='') as f:
    rows = list(csv.DictReader(f, strict=True))

accepted = []
needs_review = []
for row in rows:
    raw = row['amount_text']
    if row['currency'] != 'USD' or pattern.fullmatch(raw) is None:
        needs_review.append(row['record_id'])
        continue
    accepted.append((row['record_id'], Decimal(raw.replace(',', ''))))
print('accepted:', [record_id for record_id, value in accepted])
print('confirmed_sum_USD:', sum((value for record_id, value in accepted), Decimal('0.00')))
print('needs_review:', needs_review)

기대 출력은 accepted: ['A01', 'A02'], confirmed_sum_USD: 3234.50, needs_review: ['A03', 'A04', 'A05']입니다. 확인된 2건의 합계와 미확인 3건을 구분하고, 5건 전체의 확정 합계로 쓰지 마세요.

Decimal에는 확인한 문자열에서 값을 전달합니다. 이 예제의 작은 십진수 합계가 이진 부동소수점의 근삿값을 거치지 않도록 합니다. 임의 자릿수나 모든 금융 계산의 무제한 정밀도를 보장하는 코드는 아닙니다. Python Decimal 공식 문서

형식이 섞인 원인을 제공처에서 확인한 뒤 별도 규칙을 정하세요. 1.234,50의 쉼표를 무조건 지우면 1.23450이 되어, 소수 쉼표 형식의 1234.50과 1000배 차이가 날 수 있습니다. 점과 쉼표를 모두 지워 123450을 만드는 것도 값의 의미를 바꾸는 변환입니다.

CSV 도우미와의 연결

CSV 검사기에서는 큰따옴표 안의 쉼표가 한 필드로 읽히는지, 열 수와 원문을 확인할 수 있습니다. 이 예제는 세 열·데이터 5건이며 각 금액 문자열이 그대로 보존되는지 확인합니다. 검사기는 숫자의 지역 형식·통화·업무상 올바른 금액을 자동 판정하지 않습니다. 열 구조가 정상이라는 결과를 합계 검증으로 해석하지 마세요.

금액의 의미를 확인한 뒤 집계나 중복 비교로 넘어가세요. 숫자로 추측한 뒤 원본을 덮어쓰면 어떤 값이 들어 있었는지 대조하기 어려워집니다.

한계와 검토 정보

본문 Python 코드로 합성 원문 5건, 확인 합계USD3234.50/미확인 3건, 다른 구분자의 오변환 반례, CSV 왕복·원본 보존을 로컬에서 확인했습니다. 현재 CSV 라이브러리의 세 열·데이터 5건·값 보존도 대조했습니다. 실제 Excel 가져오기·지역 설정·셀 자료형·브라우저 UI·다운로드는 실행하지 않았습니다. 음수·통화기호·괄호 회계표기·공백/NBSP 천 단위·지수 표기·소수 두 자리 이외의 값은 이 예제의 합의 규칙 밖입니다.

검토일: 2026-10-19. 참고용 예제이며 실제 금액 규칙은 제공처 명세와 대조하세요. 세금·환율·회계처리 판단을 제공하지 않습니다.

AI 보조 작성: AI로 원고와 합성 자료를 작성하고 로컬 실행 결과를 대조했습니다. 실제 고객 자료를 사용하거나 사람의 실제 Excel 검수를 받았다고 주장하지 않습니다.

이 글의 예제 파일을 CSV 검사기에 넣어 직접 확인해 보세요.

CSV 검사기 열기 ›