ASCII 파일 읽기의 또 다른 길…

이 글은, 예전 idluser group 의 TIPS 게시판에 무림공적 이상우 옹께서 올린 글입니다. 차차, 예전 글들을 신규 사이트로 이동할 계획도 있었고(잘 안되죠 게을러서), 마침 관련된 질문이 올라오기도 하여 이곳으로 옮깁니다.  이와 관련하여 역시 이상우 옹의 “알아두면 편리한 문자열 함수들(1~4)”도 검토해 보면 ASCII 파일을 읽는 데 큰 도움이 될 것 같습니다.

  • 알아두면 편리한 문자열 함수들 1 : http://blog.daum.net/swrush/191
  • 알아두면 편리한 문자열 함수들 2 : http://blog.daum.net/swrush/192
  • 알아두면 편리한 문자열 함수들 3 : http://blog.daum.net/swrush/193
  • 알아두면 편리한 문자열 함수들 4 : http://blog.daum.net/swrush/194

ASCII 파일 읽기의 또 다른 길 (이상우 2008. 8. 28.) 

ASCII 텍스트 파일로 된 데이터를 읽어서 뭔가 작업을 해야하는 경우 readcol이라는 프로시저의 사용을 많이 권장해오고 있습니다. 대부분의 경우 이러한 방법으로 해결이 되긴 하지만, 자료 파일 자체가 좀 요상한 형식을 띄는 경우 이 readcol의 사용만으로도 순탄치않은 경우가 생깁니다. 이런 난감한 경우를 돌파하는 방법은 기본적으로 사용자의 프로그래밍 능력에 달린 문제이긴 하지만, 그래도 나름대로 이런 식이면 괜찮지않을까 하는 방법을 제안해보려고 합니다. 제가 개인적으로 자주 사용하는 방법입니다(참고로 저는 readcol을 잘 사용하지는 않습니다).

먼저 자료파일이 다음과 같은 형태로 되어있다고 합시다.

204        0.923567
205        0.369427
206        0.0636943
207        0.0764331

그러면 대략 다음과 같은 방법의 코딩이 가능합니다.

이 코드는 조금 복잡해 보이지만 나름대로 여러가지 상황에 대처할 수 있도록 변형이 가능합니다. 만약 자료파일의 값들이 그냥 빈칸(‘ ‘)이 아닌 ‘#’으로 나눠져있다고 한다면,

spl = strsplit(ss, ‘#’, /extract)

라고 하면 됩니다. 그리고 어떤 경우에는 이런 분리자로 나눠져있으나 값 자체가 존재하지 않는 경우가 있습니다. 예를 들면 다음과 같은 경우입니다.

1#204#2.423#3.221
2#205#2.136#4.194
3#206##2.871
4#207#2.582#3.429

세번째 줄을 보면 206 다음의 요소가 아예 없습니다. 이런 경우에는 다음과 같이 처리합니다.

spl = strsplit(ss, ‘#’, /extract, /preserve_null)

그러면 저렇게 분리자 사이에 아무것도 없어도 그것을 그냥 ”로 인식합니다. 물론 이러한 값은 일종의 결측값인 경우가 많으므로, 이런 상황에 맞는 값을 대체하여 넣는다든지 하는 작업을 중간에 if문 같은 것을 써서 해주면 됩니다.

그리고 자료파일의 중간에 아예 줄이 비어있는 경우가 있습니다

313        0.833333
314        0.885965
315        1

577        1
578        0.563536
579        0.132597

이런 경우 역시 다음과 같이 반복문 내에서 처리해야 합니다.

readf, lun, ss
if ss eq ” then continue

물론 이런 빈 줄이 나왔을 때 무엇을 해야하는가는 각자의 목적에 따라 다릅니다만, 이와 같이 if문을 하나 삽입해여 원하는 상황대처를 해주면 됩니다.

따라서 readcol을 사용하는 것이 당연히 간편하고 쉬운 방법이지만, 사용하고자 하는 아스키 파일이 그러한 편리함을 허락하지 않는 경우라면 이와 같이 약간 돌아가는듯 하더라도 유연한 프로그래밍이 필요할 수도 있음을 기억해두면 좋을 것 같습니다.