시트마다 다른 엑셀 헤더를 자동으로 찾기

업무 자동화4분 읽기

엑셀 자동화에서 가장 먼저 부딪히는 벽은 계산도 피벗도 아니라 "어디부터가 표인가"입니다. 사람이 손으로 관리해 온 워크북은 규칙이 없습니다. 어떤 시트는 맨 위에 보고서 제목이 한 줄, 그 아래 단위 안내가 또 한 줄 붙고 나서야 표가 시작됩니다. 어떤 시트는 그런 장식 없이 첫 줄부터 데이터입니다. 분기마다 갱신되는 공공 무역통계 엑셀을 자동으로 읽어 교차분석표를 만드는 프로젝트에서, 이 헤더 위치 문제를 사람 없이 넘기는 것이 첫 관문이었습니다. 그 감지 로직을 어떻게 설계했는지 정리합니다.

왜 헤더 위치가 고정이 아닌가

기계가 만든 데이터라면 헤더는 늘 첫 줄에 있습니다. 문제는 사람이 보기 좋으라고 다듬은 엑셀입니다. 표 위에 제목을 얹고 단위를 괄호로 안내하고 비어 있는 줄로 여백을 주는 것은 사람에게는 친절이지만 프로그램에게는 잡음입니다. 게다가 하나의 워크북 안에서도 연전체 시트와 분기 시트의 서식이 조금씩 달라 시트마다 헤더가 몇 번째 줄에 있는지가 흔들립니다.

가장 나쁜 대응은 "헤더는 3번째 줄"처럼 위치를 코드에 박아 두는 것입니다. 그렇게 하면 다음 분기에 안내 문구가 한 줄 늘어나는 순간 전체가 어긋나고 담당자는 다시 사람을 부릅니다. 자동화의 수명은 이런 하드코딩에서 짧아집니다. 위치가 아니라 "그 줄이 헤더처럼 생겼는가"를 보고 판단해야 서식이 흔들려도 버팁니다.

위치가 아니라 생김새로 판정한다

그래서 감지기는 시트를 위에서부터 한 줄씩 스캔하면서 각 줄이 우리가 아는 표준 헤더와 얼마나 닮았는지를 봅니다. 이 데이터의 표준 스키마는 년도, 기간, 유형, ICT산업, 기관형태, 지역과 수출, 수입, 수지까지 아홉 개 열입니다. 한 줄에 이 이름들이 여섯 개 이상 나타나면 그 줄을 헤더로 확정합니다.

임계값을 아홉 개 전부가 아니라 여섯 개로 잡은 데는 이유가 있습니다. 실제 워크북에서는 열 이름이 미묘하게 다릅니다. "기간" 대신 "분기"라고 적혀 있기도 하고 앞뒤에 공백이 섞이거나 맨 끝 열이 비어 있기도 합니다. 완전 일치를 요구하면 사소한 표기 차이 하나에 감지가 실패합니다. 다수결에 가깝게, 아는 이름이 충분히 많이 보이면 헤더로 인정하는 편이 현실의 엑셀에 훨씬 강합니다.

헤더가 아예 없는 시트를 다루기

까다로운 경우는 헤더 행 자체가 없는 시트입니다. 첫 줄부터 곧바로 숫자와 코드가 들어찬 데이터인 경우죠. 이때는 헤더를 찾겠다고 계속 내려가 봐야 소용이 없습니다. 그래서 첫 줄을 검사해 이것이 헤더가 아니라 데이터 행처럼 보이면, 헤더가 없다고 판정하고 표준 헤더 아홉 개를 우리가 대신 씌워 읽습니다. 시트에 헤더가 없어도 다음 단계에서는 똑같이 아홉 개 열을 가진 표로 취급됩니다.

반대로 아무리 스캔해도 헤더 비슷한 줄이 나오지 않는 시트도 있습니다. 표지, 차트, 메모처럼 애초에 표가 아닌 시트입니다. 이런 시트는 억지로 읽지 않고 건너뜁니다. 다만 조용히 버리지는 않습니다. 어떤 시트를 왜 건너뛰었는지는 검증 리포트에 남겨 나중에 사람이 "이 시트가 빠진 게 맞나"를 확인할 수 있게 했습니다. 자동으로 건너뛰는 것과 몰래 누락되는 것은 전혀 다른 일입니다.

감지 다음은 곧바로 정규화

헤더 행을 찾았다고 끝이 아닙니다. 찾은 헤더의 앞뒤 공백을 다듬고 "분기"처럼 다른 이름으로 적힌 열을 표준 이름에 맞춰 준 다음, 그 아래 데이터를 공통 스키마로 읽어 들여야 비로소 여러 시트를 하나로 합칠 수 있습니다. 헤더 감지는 그 자체가 목적이 아니라, 제각각인 엑셀을 하나의 통합 데이터프레임으로 모으는 정규화의 입구입니다. 감지가 위치에 강해야 그다음 정규화가 조용히 돌아갑니다.

자동화의 견고함은 화려한 알고리즘이 아니라 이런 입구의 관용에서 나옵니다. 사람이 만든 데이터는 언제나 예외를 품고 있고 그 예외를 위치 하드코딩으로 막으면 자동화는 첫 서식 변경에 무너집니다. 위치가 아니라 생김새로 판정하고 못 읽는 것은 조용히 버리지 말고 기록으로 남기는 것. 이 두 가지가 분기마다 사람을 다시 부르지 않는 자동화의 조건이었습니다.

이 헤더 감지가 어떤 정규화로 이어지는지는 이기종 엑셀 정규화에서, 정규화된 데이터로 교차표를 만드는 과정은 교차분석표 자동 피벗에서 이어집니다. 전체 사례는 무역 통계 엑셀 교차분석 자동화에서 볼 수 있습니다.

자주 묻는 질문

헤더 감지 임계값을 왜 완전 일치로 하지 않았나요?

실제 워크북의 열 이름은 미묘하게 다르기 때문입니다. 표기가 살짝 다르거나 공백이 섞이거나 맨 끝 열이 비어 있는 일이 흔해서 아홉 개 전부 일치를 요구하면 사소한 차이 하나로 감지가 실패합니다. 아는 이름이 여섯 개 이상 보이면 헤더로 인정하는 다수결 방식이 현실의 엑셀에 훨씬 안정적이었습니다.

헤더가 없는 시트는 어떻게 구분하나요?

첫 줄을 검사해 그것이 헤더 이름들이 아니라 데이터 값처럼 보이면 헤더가 없는 시트로 판정합니다. 이 경우 표준 헤더 아홉 개를 대신 씌워 읽으므로, 헤더가 없어도 다음 단계에서는 동일하게 아홉 개 열을 가진 표로 처리됩니다.

못 읽는 시트가 있으면 그냥 무시되나요?

무시하지 않고 건너뛴 뒤 그 사실을 검증 리포트에 남깁니다. 표지나 차트처럼 표가 아닌 시트는 자동으로 제외되지만 어떤 시트를 왜 건너뛰었는지가 기록으로 남아 사람이 나중에 누락 여부를 확인할 수 있습니다. 조용히 사라지는 것과 기록을 남기고 건너뛰는 것은 다릅니다.

#엑셀자동화#헤더감지#openpyxl#데이터정규화

업무자동화 구축이 필요하신가요?

무료 상담 신청