Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 여러 파일·시트의 데이터를 병합할 때 중복 데이터를 정확히 식별·정리하여 신뢰도 높은 통합 테이블을 만드는 실무 절차와 도구 사용법을 제공하는 것이다.
데이터 병합 과정에서 중복은 다양한 경로로 발생한다. 근본 원인을 식별하면 처리 전략이 단순해진다.
병합의 품질은 키 정의와 사전 표준화에 좌우된다.
| 표준화 함수 | 용도 | 예시 |
|---|---|---|
| TRIM | 앞뒤·중복 공백 제거 | =TRIM(A2) |
| CLEAN | 인쇄 불가 문자 제거 | =CLEAN(A2) |
| UPPER/LOWER/PROPER | 대소문자 정규화 | =UPPER(A2) |
| SUBSTITUTE | 특정 문자 치환 | =SUBSTITUTE(A2,"-","") |
| NUMBERVALUE | 지역 구분자 숫자 변환 | =NUMBERVALUE(A2,",",".") |
| TEXTSPLIT/TEXTBEFORE/TEXTAFTER | 토큰 분리 | =TEXTSPLIT(A2,",") |
| DATEVALUE | 텍스트→날짜 | =DATEVALUE(A2) |
| 상황 | 권장 도구 | 장점 | 단점 |
|---|---|---|---|
| 완전 동일 행 중복 | 데이터 탭 → 중복 제거 | 빠르고 간단하다 | 되돌리기 어려우므로 사본 필요하다 |
| 키 기준 중복 | 피벗테이블·파워쿼리 그룹화 | 집계·최신값 선택 가능하다 | 설정이 필요하다 |
| 유사 문자열 중복 | 파워쿼리 퍼지 매치(Fuzzy) | 근접 일치 자동 연결이다 | 임계값 튜닝 필요하다 |
| 수식 기반 동적 목록 | UNIQUE/FILTER/VSTACK | 변경 즉시 반영된다 | Microsoft 365 필요하다 |
| 대용량·반복 병합 | 파워쿼리·VBA | 자동화에 유리하다 | 학습 곡선이 있다 |
해법은 비파괴적이므로 품질 검증에 유리하다.
=UNIQUE(A2:D1000, , TRUE) 열 조합으로 고유 행을 만들려면 병합 키를 보조열에 만든다.
=UNIQUE(CHOOSECOLS(A2:D1000,1,3)) =FILTER(A2:D1000, COUNTIF(A2:A1000, A2:A1000)>1) =SORTBY(UNIQUE(A2:C1000), BYROW(A2:C1000, LAMBDA(r, MAX(IF(A2:A1000=TAKE(r,1), D2:D1000)))), -1) 위 예시에서 열 D는 날짜이며 동일 키의 최대 날짜를 기준으로 정렬한다.
동일 키의 여러 후보 행이 있을 때 한 줄로 정리하는 규칙이 필요하다.
'VBA 예시: 키 기준으로 최신 날짜 행만 남기기(정렬 기반) Sub KeepLatestByKey() Dim rng As Range Set rng = Range("A1").CurrentRegion ' A열=Key, D열=Date rng.Sort Key1:=Range("A1"), Order1:=xlAscending, _ Key2:=Range("D1"), Order2:=xlDescending, Header:=xlYes Dim i As Long For i = rng.Rows.Count To 2 Step -1 If Cells(i, 1).Value = Cells(i - 1, 1).Value Then Rows(i).Delete End If Next i End Sub '고객명 표준 텍스트 =UPPER(TRIM(SUBSTITUTE(SUBSTITUTE(A2,"(주)",""),"㈜","")))
'전화번호 하이픈 제거
=SUBSTITUTE(B2,"-","")
'복합키 생성: 고객ID가 없을 때
=CONCAT( [@표준고객명], "|", [@전화번호] )
=LET(t, A2:E10000, k, INDEX(t,,1), '키 열 dup, COUNTIF(k, k)>1, FILTER(t, dup)) =BYROW(UNIQUE(A2:A10000), LAMBDA(k, LET(rows, FILTER(A2:E10000, A2:A10000=k), idx, XMATCH(MAX(INDEX(rows,,5)), INDEX(rows,,5)), TAKE(DROP(rows, idx-1), 1) ))) 위 예시는 키별 최신 수정일(5열)을 가진 행을 반환한다.
=LET(u, UNIQUE(A2:A10000), result, MAP(u, LAMBDA(k, LET(r1, FILTER(B2:E10000, A2:A10000=k), pr, XLOOKUP("Source_Priority", HeaderRow, HeaderRow), '개념적 예시 TAKE(r1,1)))), result) 실제 구현에서는 파워쿼리의 조건 열 또는 사용자 지정 열로 우선순위를 점수화하고 정렬 후 첫 행을 확정한다.
동일 키에서 기간이 겹치는 레코드는 다음 규칙으로 정리한다.
'파워쿼리 단계 요약 정렬(키, 시작일), 인덱스 추가, 다음 행과 비교하여 시작일 ≤ 이전 종료일이면 병합 처리 | 지표 | 정의 | 권장 기준 |
|---|---|---|
| 중복률 | 중복 행 수 / 전체 행 수 | 5% 이하 유지 |
| 키 누락률 | NULL 키 수 / 전체 행 수 | 0% 목표 |
| 형식 오류율 | 형식 불일치 셀 수 / 전체 셀 수 | < 1% |
| 매칭 정확도 | 표본 감사에서 올바른 매칭 비율 | > 98% |
자동화 파이프라인에는 항상 ‘예외 테이블’이 필요하다. 매칭 실패·다중 매칭·형식 오류 행을 별도 시트에 기록하고 검토한다.
=LET(t, A2:E10000, k, INDEX(t,,1), dup, COUNTIF(k,k)>1, IF(dup, "DUP", IF(k="", "NULL", ""))) 상태 열을 만들어 ‘DUP’, ‘NULL’, ‘OK’를 표시하고 필터링으로 예외만 추출한다.
=UNIQUE(VSTACK(TableA, TableB, TableC)) // 중복 제거 및 최신값 선택 예시 let Source = Excel.CurrentWorkbook(){[Name="Table_All"]}[Content], ChangedTypes = Table.TransformColumnTypes(Source,{{"Key", type text},{"Date", type date}}), Sorted = Table.Sort(ChangedTypes,{{"Key", Order.Ascending},{"Date", Order.Descending}}), Grouped = Table.Group(Sorted, {"Key"}, {{"Top1", each Table.FirstN(_,1), type table [Key=nullable text, Date=nullable date, ...]}}), Expanded = Table.ExpandTableColumn(Grouped, "Top1", {"Date","ColA","ColB"}) in Expanded Sub CopyUniques() Dim rng As Range, dst As Range Set rng = Range("A1").CurrentRegion Worksheets.Add After:=ActiveSheet Set dst = ActiveSheet.Range("A1") rng.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=dst, Unique:=True End Sub '공백·특수문자 제거 후 키 생성 =LET(x, UPPER(TRIM(SUBSTITUTE(SUBSTITUTE(A2,"-","")," ",""))), y, SUBTOTAL(9, 1), x)
'다중 열 결합 키
=CONCAT( UPPER(TRIM(A2)), "|", UPPER(TRIM(B2)), "|", TEXT(C2,"yyyy-mm-dd") )
'중복 플래그
=IF(COUNTIF($A$2:$A$10000, A2)>1, "DUP", "OK")
· 총 행 수: 125,340 · 제거된 중복: 6,214 (4.96%) · 키 누락: 0 · 형식 오류: 327건 수정 완료 · 매칭 정확도(표본 n=500): 99.2% · 잔여 예외: 18건(수동 검토 예정) 직접 삭제 기능을 사용했다면 즉시 실행 취소를 활용하거나 백업 시트에서 다시 가져와야 한다. 차후에는 고급 필터나 파워쿼리로 비파괴적 파이프라인을 구성하는 것이 안전하다.
데이터 특성에 따라 다르다. 일반적으로 0.8 전후에서 시작하여 표본 100~200건을 수작업 검증하며 조정하는 것이 합리적이다. 상호 교차 검증을 위해 ‘일치 후보 수’가 1을 초과하는 케이스를 예외 테이블로 분리한다.
표준화한 이름·전화·주소 등 열을 결합한 복합키를 설계하고, 일치 불가 케이스는 후보군 테이블로 보류하여 수동 매핑한다. 장기적으로 시스템 발급 키를 도입한다.
정책을 사전에 명시한다. 최신 날짜 우선, 우선순위 소스 우선, 비어 있지 않은 값 우선 등의 규칙을 문서화하고 동일 규칙을 전 과정에 적용한다.
반복·대용량·다중 파일 병합은 파워쿼리가 우수하다. 단발성 소규모 정리는 수식이 빠르다. 혼합 전략으로 초기 표준화는 수식, 병합·집계는 파워쿼리로 구성한다.