티스토리 뷰

Office

[Excel] LEFT, FIND 함수를 이용한 string parsing

생각많은 소심남 2015. 4. 12. 14:35

* edx에서 진행되는 spreadsheet강의에서 발췌한 내용입니다.


아무래도 실험을 하는 입장에서 제일 많이 쓰는 툴이 엑셀이 될 것이다. 굳이 실험에 한정짓지 않더라도, 재무 회계정리를 할 때도 엑셀은 참 강력한거 같다. 그런데 결과를 정리하다 보면 가끔 어떤 셀안의 특정 데이터만을 필요로 할때가 있다. 예를 들어서 오늘의 주식 정보가 올랐는지 내려갔는지를 엑셀로 그대로 데이터를 옮겨보면 다음과 같다고 치자.



난 이중에서 얼마나 올랐는지는 상관없고, 단순히 올라갔는지 내려갔는지만을 알고 싶다. 그럼 결국 change열에서 UP이냐 DOWN이냐만 빼오면 쉬울 것이다. 하지만 그안에 들어있는 값 자체가 string이기 때문에 내가 원하는 열만 잘라서 가져와야 한다.(컴파일러에서는 tokenization이라고 하던데...) 이걸 도와주는 함수가 LEFT()다.

 LEFT함수는 원하는 데이터셀과 왼쪽에서 얼마만큼 자를건지를 지정해주면 그거만큼 잘라주게 된다. 그럼 위의 Change가 있는 열에서도 단순하게 LEFT(CELL, 2)를 해주게 되면 UP만 빼올 수 있을 것이다. 그런데 아마 결과를 쭉쭉 뽑다보면 이런 결과를 얻게 된다.


이상한 점을 발견할 것이다. Down이라고 되어 있는 부분도 LEFT를 이용해서 자를 경우 2라는 인자의 영향을 받기 때문에 전체 빼올 문자중 2문자밖에 못 빼오는 것이다. 그럼 결론은 자신이 원하는 데이터셀의 특성에 맞게 LEFT를 써야 한다는 것이다. Change column을 유심히 보다보면 뭔가 구분지을 수 있는 특성이 나온다. 바로 ' '(space)인데, 잘 보면 space 단위로 원하는 정보가 이미 나눠져 있다는 것을 알게 된다. 그러면 이 space의 위치만을 알게 된다면, 내가 원하는 셀에 맞게 그 string을 구해올 수 있을 것이다. 이 space를 찾는데 도와주는 함수가 FIND 함수다.

 FIND 함수는 말그대로 자기가 원하는 문자를 해당 셀에서 찾고 그의 위치를 return해주는 함수다. 그럼 결국 이렇게 찾은 위치를 앞에서 언급한 LEFT 함수의 위치를 지정하는 인자에 넣어주면 우리가 원하는 문자열을 구할 수 있게 된다. 유의할 점은 LEFT를 구할 때 space의 위치는 굳이 필요하지 않으므로 space가 포함된 위치는 빼줘야 한다. 예를 들어서 FIND함수를 통해 space의 위치를 알았으면 거기서 1을 빼줘야 내가 원하는 그 문자열이 딱 나오는 것이다. 함수로는 다음과 같다.

=LEFT(DATACELL, FIND(' ', DATACELL)-1)


되게 직관적으로 표현한 내용이고 결과도 다음과 같이 잘 나온다. 



이전에 어떤 프로그램을 돌려서 csv 파일을 만들때는 이렇게 엑셀로 데이터를 원하는대로 뽑는 방법을 몰라서 그냥 c프로그램내에서 표현하는 방식을 다를게 하곤 햇었는데, 그렇게 하면 프로그램을 컴파일하는 시간이나, 그 데이터가 어떤 셀에 나오는지를 정확히 계산해야 되서 뭔가 비효율적이었는데.. 뭔가 이렇게 엑셀내에서 처리할 수 있는 방법을 알면 유용하게 써먹을 수 있을거 같다. 


*참 우연히 보면서 안 기능인데 엑셀 내에는 web상에서의 table을 그대로 엑셀로 변환시켜주는 기능이 있다. 아마 엑셀 2010버전에서는 '외부 데이터 가져오기' 항목에 웹 항목이 있을 것이다. 

이걸 누르면 작은 창이 뜨는데 여기에 자기 import시키고 싶은 table이 들어있는 주소를 넣어준다. 참고로 위에서 쓰인 예시의 데이터는 Amsteldam Exchange Market(AEX)의 데이터를 가져온 것이다. 



그러면 table 옆에 화살표가 활성화되는데 이때 자기가 원하는 data를 선택하면 위와 같이 block이 쳐진다. 이걸 가져오기로 가져오면 된다. 그러면 



짠 하고 쉽게 가져올 수 있다. 아마 내가 알기로는 그냥 드래그에서 가져오면 font tag도 그대로 딸려와서 table이 엉키는 현상이 발생할텐데 이렇게 하면 손쉽게 data를 import 할 수 있겠다.

댓글