2017년 8월 29일 화요일

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

특정 웹사이트의 데이터 목록을 엑셀로 정리하는 방법에 대한 질문을 받았다.

얘를

요렇게

웹상에서 단순 텍스트가 아닌, table이나 list 형식을 갖는 데이터는 구글 스프레드시트의 importhtml 함수를 이용하면 비교적 쉽게 엑셀로 불러올 수 있다. 그런데 여기는 좀 이상하다.

실제 웹상에는 103위까지의 리스트가 표시되고 있는데 28위까지만 불러온다. 웹 소스를 들여다봐도 역시 데이터는 28위까지만 존재. 나머지 데이터는 어떻게 불러오는 거지?


별수 없이 웹상에서 긁어다 복사. 그런데 공백을 이용한 필드 구분이 28위까지만 적용되어 있다. 29위부터는 필드 구분 기준이 없다는 얘기.


포기하려다 혹시나 싶어 익스플로러에서 데이터를 긁어봤더니 다음처럼 각 필드가 분리된 채로 복사가 된다. 시간, 조회수 필드만 공백을 기준으로 한 줄에 표시됨.


이정도면 할만하다. VIM 글로벌 명령어를 이용해서 일단 빈 줄 삭제.

빈 줄 검사

삭제

특이하게 제목을 두번씩 불러왔는데, 중복을 막기 위해 순위 번호 다음 줄에 이어지는 제목을 삭제했다. 다음은 숫자로 시작하는 줄로 시작, 이어지는 줄까지 검사하는 정규표현식 '^\d+\n.*' 사용 결과.


후방탐색을 이용해서 숫자로 시작하는 줄을 제외하면 두 번째 줄만을 검사할 수 있다.

검사

if you can search, it is easy to delete.

삭제

이제 시간, 조회수 필드만 다른 줄로 분리하면 모든 필드의 구분이 끝나는데, 그전에 먼저 레코드 구분 작업을 해야 한다. 다섯 줄 단위로 구분할 수 있는 기준을 만들어야 한다는 얘기. 순위 번호 위에 구분 기호를 추가해보자. 먼저 숫자로 시작(^) 후, 숫자로 끝나는($) 순위 번호 검사.


치환 명령을 이용해서 순위 번호 위에 구분 기호(-----) 추가.


이제 시간, 조회수 필드만 다른 줄로 분리해주면 된다. 숫자(\d) 이후 공백(\s)이 이어지는 문자열만 검사.


후방탐색을 이용하면 공백만을 검사할 수 있다.


검사된 공백을 엔터 문자(\r)로 치환. 글로벌 옵션을 사용하지 않는 치환 명령은 최초 일치하는 패턴만을 치환한다. 시간과 조회수 필드 분리 성공.


이제 각 줄 끝에 필드 구분 기호를 추가해주면 된다. 다음은 줄 끝을 의미하는 줄바꿈 문자 '\n'을 구분 기호 'ㅋ'으로 치환한 결과.


줄바꿈 문자가 사라졌기 때문에 전체 데이터가 한 줄로 표시되고 있다. 이제 사전에 레코드 구분 기호로 추가했었던 '-----'를 다음처럼 엔터 문자로 바꾸면 레코드 구분이 완성된다.


엑셀에서 필드 구분 기호로 추가해준 'ㅋ'을 기준으로 텍스트를 나누면 끝.

댓글 없음:

댓글 쓰기

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