2017년 8월 2일 수요일

정규표현식으로 월급 루팡 하기

국가간 무역 분쟁 기록을 엑셀로 정리해야 하는데 쉬운 방법 없겠냐는 질문을 받았다.

애를

요렇게

이런 작업이 빈번하다면 웹상의 데이터 수집 및 처리 관련된 프로그래밍 지식을 빨리 익혀야겠지만, 당장은 열심히 복붙 수작업을 하는 게 빠를 것이다. 그런데 정규표현식을 이용하면 의외로 쉽게(?) 처리할 수 있다.

일단 해당 사이트에서 필요한 데이터를 긁어온 결과는 다음과 같다. 하나의 사건이 4개의 줄 단위로 나뉘어 있는 구조.


4개의 줄을 6개의 필드로 나뉜, 하나의 줄로 바꿔야 한다. 즉 다음 구조를,

DS525공백Ukraine공백-공백Measures relating to Trade in Goods and Services
COMPLAINANT:공백RUSSIAN FEDERATION
CONSULTATIONS REQUESTED:공백19 MAY 2017
CURRENT STATUS:공백IN CONSULTATIONS

다음과 같은 테이블 구조로 바꿔야 한다.

DS525구분기호Ukraine구분기호Measures relating to Trade in Goods and Services구분기호RUSSIAN FEDERATION구분기호19 MAY 2017구분기호IN CONSULTATIONS

'문자열:공백' 영역을 '구분기호'로 바꾼 후, 4개의 줄을 하나로 합치면 될 듯. 해보자. 언제나 그렇듯 검사만 할 수 있으면 삭제는 쉽다.

'문자열:공백' 영역 검사

'문자열:공백' 영역 삭제

줄을 합치는 것도 쉽다. 줄 끝을 의미하는 줄바꿈 문자(\n)를 삭제하면 줄 구분이 사라지기 때문. 문제는 각 줄을 4개 단위로만 합쳐야 한다는 것이다.

VIM 치환 명령어 '%s/\n//'는 모든 줄의 줄바꿈 문자를 삭제해버리기 때문에 다음처럼 모든 데이터가 한 줄로 바뀌어 버린다.


각 사건의 네 번째 줄 끝에 위치하는 줄바꿈 문자는 지우면 안 된다는 얘기. 음, 어쩌나? 데이터의 구조를 다시 한 번 살펴보자.


삭제 대상인 '문자열:공백' 영역은 모두 이전 줄 끝과 이어져 있다. 그렇다면 '줄끝문자열:공백' 영역을 삭제하면 어떨까? 해보자.

첫 번째 줄의 '줄바꿈 문자'부터 검사 시작

두 번째 줄의 ':공백'에서 검사 종료

최종 검사 결과는 다음과 같다. 결과적으로 각 사건별 네 번째 줄의 줄바꿈 문자는 검사 영역에 포함되지 않는다.


검사에 성공했으니 삭제든, 치환이든 다 내맘. 다음은 VIM 치환 명령어를 이용해서 검사 결과를 구분 기호 'ㅋ'으로 치환한 결과.


이제 '일련번호공백분쟁국공백-공백타이틀' 영역만 구분하면 된다. 쉽지 뭐.

'일련번호공백분쟁국' 영역 구분

'분쟁국공백-공백타이틀' 영역 구분

최종 결과물을 엑셀로 불러들여 '텍스트 나누기' 기능을 실행하면 끝. 프로그래밍까지 익혀서 자동화한다면 이제 당신은 본격 월급 루팡(..)

"문자열 데이터가 뛰어봐야 정규표현식 손바닥 안" - 데이터 분석이 쉬워지는 정규표현식(459페이지)

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스