IDL에서 텍스트 자료로부터 값들을 읽어들일 때, 간혹 숫자값에 코마(,)가 들어가있는 경우들이 있습니다. 우리가 손으로 숫자를 쓸 때 습관적으로 1천 단위마다 코마를 붙이는데, 이러한 표기법이 그대로 반영된 아스키 자료 파일들이 많지는 않지만 그래도 심심치않게 등장하기도 합니다. 그러면 이러한 값을 IDL에서 READF와 같은 내장 프로시저를 사용하거나 또는 IDL Astro 라이브러리의 READCOL 프로시저를 사용하여 읽으면 그 값이 제대로 인식이 될까요?
예를 들어, 파일내에서 "17,000"이라고 적힌 값을 읽어온다고 할 때, 이를 숫자형 즉 정수 또는 실수형으로 읽어오게 되면 온전하게 17000으로 인식되지는 않습니다. 왜냐하면 IDL에서는 이런 코마 표기법으로 되어 있는 숫자를 제대로 인식하지는 못하기 때문입니다. 따라서 READF나 READCOL에서 I, F와 같은 FORMAT 코드를 바로 사용해서는 값을 제대로 인식할 수 없습니다. 그렇다면 해결방법은 무엇일까요? 기본적으로는 문자형(포맷코드 A)으로 읽어온 다음, 적절한 처리를 거쳐 정수나 실수로 변환하는 과정을 밟아줘야 합니다. 예를 들어, 문자로 읽어온 상태의 값이 다음과 같이 있다고 합시다. 그리고 이 문자값을 바로 실수형으로 변환하여 그 값을 확인해봅시다.
str = '17,000'
PRINT, FLOAT(str)
그런데 이와 같이 a를 출력해보면 실제로 출력되는 값은 17.0으로 나옵니다. 왜냐하면, 코마(,)는 숫자로서 인식 불가능한 문자이기 때문에 그 앞에 있는 '17'까지만을 숫자로 인식하고 말기 때문입니다. 뒤에 있는 '000'은 그냥 버려집니다. 결국 원흉은 코마(,)이고 이를 제거하는 것이 급선무입니다. 물론 방법이 있습니다. 문자처리 함수 몇 개만 이용하면 되는데요. 요령은 다음과 같습니다.
spl = STRSPLIT(str, ',', /EXTRACT)
str_new = STRJOIN(spl)
PRINT, FLOAT(str_new)
출력된 결과를 보면 17000.0이란 값으로 제대로 인식이 되어 있음을 확인할 수 있습니다. 위의 코드에서는 코마(,)를 기준으로 문자열을 마디마디 분리해내고, 그렇게 분리된 조각들을 다시 합친 다음, 이 문자를 실수로 변환하였습니다. 즉 STRSPLIT 함수가 코마를 기준으로 분리해낸 조각 문자들에서는 이미 코마는 제거된 상태가 됩니다. 그 조각들만 STRJOIN 함수로 합쳤으므로, str_new는 '17000'이란 문자값이 되고, 이를 FLOAT 함수로 실수 변환을 해주는 과정이 되는 셈입니다.
실전에서 사용되는 아스키 파일들을 보면 참으로 다양한(다시 말하면 처리가 까다로운 또는 지저분한?) 경우들이 등장하는데, IDL에 내장된 다양한 문자처리 함수들을 사용하여 의외로 간단하게 처리가 가능한 경우들도 꽤 있습니다. 오늘 소개된 내용 역시 이러한 하나의 좋은 예라고 할 수 있겠습니다.
'IDL > Programming' 카테고리의 다른 글
CV_COORD 함수에 대하여 (0) | 2014.02.19 |
---|---|
함수 부프로그램에서 여러 개의 값들을 돌려 받는 방법 (0) | 2013.10.04 |
2바이트 유니코드 문자(한, 중, 일 언어) 처리의 예 (0) | 2013.08.14 |
삼각함수의 사용에 있어서 유의할 점들 (0) | 2013.07.04 |
배열 인덱싱에 관한 간단한 팁 (0) | 2013.06.03 |