알아두면 편리한 문자처리 함수들 [2]

이번에는 STRSPLIT라는 함수에 대해 알아보겠습니다. 내용이 약간 긴 관계로 오늘은 이 함수 하나만 소개할까 합니다.

4. STRSPLIT

이 함수는 문자열내에서 특정한 문자로 구분되어진 마디마디의 문자값들을 분리하여 얻게 해주는 역할을 합니다. 주로 과학기술 분야의 아스키형 자료들이 이와 유사한 형태를 갖는데, 이러한 자료를 읽는데 있어서 유용하게 사용됩니다. 예를 들어 다음과 같은 형태의 아스키 자료가 존재한다고 가정해봅시다. 여기서 각 줄의 값들은 공백(space)으로 떨어져 있는 경우입니다.

2013  Jan  01  15  12  22
2013  Jan  02  17  21  16
2013  Jan  03  24  18  11
………..

이런 형태의 자료를 읽을 때에는 먼저 OPENW 명령으로 파일을 열고, READF 명령으로 각 줄을

읽어들이는 과정이 반복되는 것이 통상적인 방법입니다. 이런 식으로 한 줄을 읽었다면 그 줄의 내용이 하나의 문자값이 됩니다. 이와 같은 문자값이 ss라는 변수에 저장되어 있다고 합니다. 예를 들어 첫번째 줄을 읽었다면 ss에는 그 줄의 내용이 전부 들어가 있을 것이고, 확인을 위하여 ss를 출력해보면 다음과 같이 나올겁니다.

이제 ss의 내용에서 공백으로 분리되어 있는 값들을 개별적으로 인식하는데 있어서 STRSPLIT 함수가 사용됩니다. 요령은 다음과 같습니다.

이와 같이 STRSPLIT 함수를 사용하면, 분리된 값들을 모아놓은 하나의 배열(spl)을 되돌려줍니다. 그리고 이 배열을 HELP로 확인해보면, 6개의 문자값들로 이루어진 문자형 배열임을 확인할 수 있습니다. 그냥 눈으로 봐도 ss에서 공백으로 나눠진 개별 원소값이 총 6개인 것은 금방 알 수 있습니다. 그래서 개별 원소값을 출력해보면 해당값이 출력됩니다. 다만 여기서 유의할 것은 분리된 개별 원소값 자체는 여전히 ‘문자형’ 값이라는 점입니다. 즉 2013, Jan, 01, 15, 12, 22의 값들은 아직까지는 문자형 값인 상태입니다. 따라서 년도에 해당되는 2013이란 값을 갖고 차후에 뭔가 계산을 한다든지 하는데 있어서 정수형으로 인식시킬 필요가 있다면, 바로 뒤에서 이 값을 정수형으로 변환하여 사용해야 합니다. 예를 들면 다음과 같은 방식이 될겁니다.

참고로 FIX는 어떤 값의 자료형(Type)을 정수형(Integer)으로 변환해주는 내장함수입니다. 실수의 경우는 FLOAT라는 함수를 사용하면 됩니다. 어쨌든 이와 같은 방식으로 STRSPLIT 함수를 사용하면, 특정 분리자로 구분되어 있는 값들을 개별적으로 인식할 수 있습니다. 자료에 따라서는 콤마(,), 슬래쉬(/) 등이 사용되기도 하는데, 이런 경우에도 STRSPLIT 함수의 두번째 인자를 ‘,’ 또는 ‘/’와 같이 지정해주면 됩니다.

사실 이런 형태의 아스키 자료들은 읽기 좋게 깔끔하게 나오는 경우도 있지만, 그렇지 않은 좀 난감한 형태로 제공되는 경우도 이 바닥에서는 종종 있습니다. 예를 들어, 어떤 자료가 ‘#’라는 분리자로 구분된 다음과 같은 형태로 존재한다고 가정해봅시다.

2013#Jan#04#13##21

처음에 제시했던 예제자료와 비슷하긴 한데, #로 구분된 사이사이를 잘 보면 끝에서 두번째의 개별값은 아예 존재하지 않는 경우입니다. 물론 자료에 따라서는 이런 missing 값을 9999와 같은 의미없는 문자를 부여하기도 하지만, 어떤 경우에는 이렇게 아예 누락된 채로 제공되는 경우도 있습니다. 이런 경우에는 STRSPLIT 함수를 사용하는데 있어서 키워드 하나를 추가하면 됩니다.

이와 같이 PRESERVE_NULL이라는 키워드를 사용하면, 분리자 사이에 아예 문자값 자체가 누락된 경우라도 이를 null, 즉 ”와 같은 문자값으로 일단은 인식합니다. 결과를 확인 출력해보면 다음과 같이 나올겁니다.

물론 이러한 null 값에 대한 이후의 처리는 프로그래머의 재량이겠지요. 그리고 혹시나 이 값을 FIX와 같은 함수로 정수로 변환할 경우에는 0이 됩니다. 따라서 0이란 값이 특별한 값이 아닌, 일반적으로 나옴직한 값일 경우에는 주의가 필요합니다. 이럴 경우에는 숫자로 변환하기 이전에 조건문을 사용하여 별도의 조치를 취해주는 것이 바람직합니다. 예를 들어, spl[4]의 값을 정수로 변환하여 value라는 변수에 저장하되, null 문자인 경우에는 value의 값을 -9999로 인식시키겠다고 한다면 다음과 같은 과정을 밟아주면 됩니다.

사실 아스키 자료에 존재할 수 있는 요상한 모습들은 이외에도 여러가지 다양한 경우들이 있을 수 있습니다. 그래서 다양한 문자처리 함수들을 알아두면 이러한 다소 지저분한(?) 경우들에 대하여 나름의 대처방법을 찾는데 있어서 도움이 많이 됩니다.