list를 이용한 ascii 파일 읽기

여러분은 IDL에서 ascii파일을 읽을 때 어떤 것을 이용하시나요? 아시는 분들은 아시는 astro 라이브러리의 readcol 프로시저도 있지만, readf로 읽어오시는 분들도 많으실 겁니다. 이번에 쓰는 내용은 readf함수를 이용하는 법을 알려드리고자 합니다.

제목에 list를 이용한 파일 읽기라고 했는데요. 기본적으로 readf를 할 때는 파일의 라인수와 헤더의 크기를 구하고 for문과 readf를 이용하여 파일을 읽었습니다. 이 과정은 파일의 길이를 구하지 않아도 while문과 list를 이용해서 다음과 같이 이용할 수 있습니다.

여기에서 파일의 라인수를 세는 대신에 이용하는 방법은 eof 함수의 이용입니다. eof는 end of file의 약자로 파일의 끝을 뜻합니다. IDL에서는 eof함수가 존재하여, 만약 파일의 끝일 경우 1을 반환하게 됩니다. 따라서 반복문은 파일의 마지막까지 반복하라는 뜻이 되지요.

이 코드에서 중요한 부분은 list.add 에 있습니다. 이것을 통해 list는 자신의 크기를 계속 늘려나갈 수 있기 때문에 처음부터 크기를 정해야하는 배열의 문제점을 해결하게 됩니다. 배열의 크기를 정하기 위해 처음부터 파일이 몇 줄인지 세지 않아도 된다는 것이지요. 이러한 특징을 응용한다면, readf를 쓸 때 많은 이점을 가질 수 있게 될 것입니다.

마지막으로 리스트로 만든 x와 y를  array로 만들기 위해서 toarray를 이용했습니다. 각 list들은 toarray를 이용하여 배열로 변환시키는 것이 가능합니다. 이 때 type 키워드를 통해서 어떠한 형식의 array로 할 것인지 정하는 것도 가능합니다. 이 때 배열에 못들어가는 경우가 있는데요. 이 때는 missing 키워드를 통해 배열에 넣을 수 없는 변수를 해당 값으로 변환할 수 있습니다.

세부적으로는 다르지만, 이러한 방식의 이용은 8.0 이후에 나온 HASH나 DICTINARY에서도 가능한 방식입니다. 다음은 hash를 이용한 파일 읽기의 예시입니다.

위와 같이 하면, 해쉬의 각 키에 맞춰서 파일을 읽을 수 있습니다. 단 hash를 이용한 작업은 시간이 더 오래 걸렸습니다.

오늘은 list를 이용해서 파일의 라인 수를 체크하지 않아도 안정적으로 파일을 읽는 방법을 보았습니다. 이러한 방식은 결과 데이터가 어느정도 생성되는지 알 수 없을 때 유용하게 사용할 수 있습니다. list나 hash와 같은 데이터 형태가 많이 유용하다고 생각하기 때문에 IDL 유저분들도 이러한 데이터에 익숙해졌으면 좋겠습니다.