SAVE 명령을 사용하여 .sav 형식의 파일을 만들어서 사용하는 것은 IDL 프로그래밍에 있어서 꽤 유용한 팁입니다. 특히 IDL에서 정의하여 사용하던 각종 변수, 배열 등의 항목들을 그대로 .sav 파일로 저장해두었다가 나중에 RESTORE 명령을 사용하여 복원시켜 사용하는 경우가 바로 그러합니다. 이러한 작업을 위해서는 기본적으로 SAVE 및 RESTORE 명령의 사용법을 잘 알아두는 것이 가장 중요합니다. 그리고 여기서 조금 더 나아가면 IDL_SAVEFILE이라는 객체 클래스까지도 사용할 수 있다면 더 좋습니다.
제가 예전에 이와 관련된 게시물을 한번 올린 적이 있습니다. 여기서는 외부 링크의 게시물을 하나 링크해놓았고 이 링크의 내용을 참조하시라는 안내 정도만 해드렸었는데요. 오늘은 제가 나름대로 다시 정리하여 여기서 적어볼까 합니다. 앞서 소개한 링크의 내용과 유사한 부분도 있고 약간 다른 부분도 있을 수 있음을 일단 참조해두시고 보시면 되겠습니다.
먼저 .sav 파일을 만드는 방법부터 보겠습니다. 일단 예를 들어서 IDL에서 다음과 같이 총 5개의 항목들을 정의하여 사용하고 있었다고 가정하겠습니다.
a = 5
b = 24.8
c = FINDGEN(11)
d = ['LA', 'SF', 'NY']
e = HANNING(100, 100)
이 상태에서 위의 5개 항목들(a, b, c, d, e)을 저장한 .sav 파일을 만들고자 한다면 다음과 같은 방식으로 SAVE 명령을 사용하면 됩니다.
SAVE, FILENAME='my_file.sav', a, b, c, d, e
이렇게 하면 a, b, c, d, e 항목들이 고스란히 저장된 my_file.sav라는 파일이 생성됩니다. 이렇게 생성한 .sav 파일은 나중에 내가 다시 사용할 수도 있고, 만약 필요하다면 다른 IDL 사용자가 사용할 수 있도록 제공할 수도 있습니다. 누가 사용하든간에 .sav 파일 내에 저장되어 있던 항목들을 모두 한꺼번에 복원하려면 RESTORE 명령을 사용하면 됩니다. 이러한 복원은 IDL 프로그램 내에서 또는 커맨드 입력창에서 모두 가능합니다. 예를 들어 커맨드 입력창에서 할 경우는 다음과 같습니다.
IDL> RESTORE, 'my_file.sav'
그리고 이렇게 복원된 항목들이 어떤 것들인지 확인하려면 다음과 같이 HELP 명령을 사용하면 됩니다. 그러면 복원되어 있는 항목들 모두에 대한 정보가 다음과 같이 출력됩니다.
IDL> HELP
% At $MAIN$
A INT = 5
B FLOAT = 24.8000
C FLOAT = Array[11]
D STRING = Array[3]
E FLOAT = Array[100, 100]
이와 같이 IDL 내에서 정의해두었던 각종 정보들을 한꺼번에 .sav 파일로 저장해둔 다음, 나중에 이 파일로부터 정보들을 복원하는 것이 얼마든지 가능합니다. 물론 이러한 파일 교류는 IDL 사용자들 사이에서만 가능합니다. 왜냐하면 .sav 파일을 저장하고 복원하는 것은 오직 IDL 내에서만 가능하기 때문입니다.
그런데 .sav 파일을 내가 직접 만든 것이 아니라 다른 곳에서 제공받았을 경우를 생각해봅시다. 그리고 이 파일 내에 수록된 내용에 대한 구체적인 사전 정보를 제대로 받지 못한 상태라고 가정해봅시다. 그런 경우에는 사실 받자마자 RESTORE 명령을 사용하여 .sav 파일 내 모든 정보들을 한꺼번에 복원시키는 것이 그리 바람직하지 않을 수도 있습니다. 특히나 혹시라도 파일의 제작자가 SAVE 명령을 사용하면서 /ALL 키워드를 사용했을 경우라면 더욱 그렇습니다 (그 이유에 관해서는 앞서 제시한 '외부 링크의 게시물'에 자세히 언급되어 있습니다).
따라서 복원시키기에 앞서서 .sav 파일 내에 어떤 정보들이 수록되어 있는가를 사전에 파악하고, 필요시에는 특정 정보만 선택적으로 복원시키는 것이 더 바람직할 수 있습니다. 이러한 목적을 위해서는 IDL_SAVEFILE 클래스의 객체를 사용하면 됩니다. 그 과정을 보면 먼저 다음과 같이 IDL_SAVEFILE 함수를 사용하여 .sav 파일에 대응되는 객체를 하나 생성하는 것으로 시작합니다.
sobj = IDL_SAVEFILE('my_file.sav')
그 다음에는 .sav 파일 내에 수록된 정보들에 관한 전반적인 개요를 조회하기 위하여 다음과 같이 Contents 메서드를 사용합니다.
contents = sobj.Contents()
HELP, contents
이렇게 하면 전반적인 개요가 contents라는 이름의 구조체(Structure)로 전달됩니다. HELP에 의하여 출력된 내용을 보면 다음과 같습니다.
** Structure IDL_SAVEFILE_CONTENTS, 17 tags, length=208, data length=208:
FILENAME STRING 'my_file.sav'
DESCRIPTION STRING ''
FILETYPE STRING 'Portable (XDR)'
USER STRING 'Sangwoo'
HOST STRING 'SWLee.local'
DATE STRING 'Fri Mar 12 15:11:00 2021'
ARCH STRING 'x86_64'
OS STRING 'darwin'
RELEASE STRING '8.8.0'
N_COMMON LONG64 0
N_VAR LONG64 5
N_SYSVAR LONG64 0
N_PROCEDURE LONG64 0
N_FUNCTION LONG64 0
N_OBJECT_HEAPVAR
LONG64 0
N_POINTER_HEAPVAR
LONG64 0
N_STRUCTDEF LONG64 0
이 내용을 보면 N_VAR는 .sav 파일 내에 수록된 항목들이 몇 개인가(여기서는 5개)를 알려줍니다. 그 외에도 파일의 생성자, 컴퓨터 정보 등도 함께 수록됩니다. 따라서 만약 여러분이 생성한 .sav 파일에 대해서는 출력 내용이 부분적으로 다를 수 밖에 없습니다. 어쨌든 .sav 파일의 생성 이력을 이러한 방법으로 확인할 수 있습니다.
그 다음은 .sav 파일 내에 수록된 항목별 데이터를 추출하는 과정입니다. 이를 위해서는 다음과 같이 Names 메서드를 사용하는 것이 먼저 필요합니다.
names = sobj.Names()
HELP, names
PRINT, names
그러면 .sav 파일 내에 수록된 항목별 이름들을 수록한 문자형 배열을 얻게 됩니다. 여기서는 이 배열의 이름을 names라고 정의하였습니다. 추출된 names에 관하여 HELP 및 PRINT 명령을 적용하여 출력된 내용을 보면 다음과 같습니다.
NAMES STRING = Array[5]
A B C D E
이와 같이 .sav 파일 내에 저장되어 있던 5개 항목들의 이름이 각각 a, b, c, d, e 임을 확인할 수 있습니다. 그러면 이 항목들 중 특정한 항목만 골라서 복원시킬 수 있습니다. 예를 들어서 a라는 항목만 복원시키고자 할 경우에는 다음과 같이 하면 됩니다.
sobj.Restore, 'a'
HELP, a
이와 같이 복원을 위해서는 Restore 메서드를 사용하면 됩니다. 복원된 a에 관하여 HELP 명령을 사용하여 출력된 내용은 다음과 같습니다.
같은 요령으로 다른 항목들도 선택적으로 복원시킬 수 있습니다. 만약 c라는 항목을 복원시키려면 다음과 같이 하면 됩니다.
sobj.Restore, 'c'
HELP, c
이 때 출력된 내용은 다음과 같습니다.
C FLOAT = Array[11]
그리고 b, c, d 항목들을 한꺼번에 복원시키려면 다음과 같이 하면 됩니다.
sobj.Restore, ['b', 'd', 'e']
HELP, b, d, e
이 때 출력된 내용은 다음과 같습니다.
B FLOAT = 24.8000
D STRING = Array[3]
E FLOAT = Array[100, 100]
따라서 .sav 파일로부터 내부 정보를 복원시키는데 있어서 그냥 한꺼번에 복원시키고자 할 경우에는 단순히 RESTORE 명령을 사용하면 되겠지만, 만약 .sav 파일 내에 수록된 정보들을 먼저 파악하고 필요한 것만 복원시켜야 하는 경우에는 IDL_SAVEFILE 클래스의 객체를 이용하여 위와 같이 처리하는 것이 더 나을 수도 있습니다. 특히나 .sav 파일을 외부에서 받아왔는데 출처도 불분명하고 수록된 정보에 대한 별다른 사전 정보가 없는 경우에는 위와 같은 방법이 특히 더 유용하다는 점을 염두에 두시면 좋을 것 같습니다.
'IDL > Programming' 카테고리의 다른 글
벡터(Vector)의 각도에 대한 정의 및 관련 이슈 (0) | 2021.12.03 |
---|---|
FILE_SEARCH 함수에 관하여 (0) | 2021.07.14 |
NG 체계에서의 문자 표기 관련 팁 몇가지 (PDF 문서) (0) | 2020.11.30 |
텍스트 파일을 효과적으로 읽는 방법에 관하여 [5] (2) | 2020.04.07 |
IDLnetURL 클래스를 이용하여 네트워크를 통한 파일 수신 하기 (0) | 2020.03.24 |