2013-07-22 3 views
1

일부 데이터를 분석하기 위해 여러 IDL 프로그램을 작성했습니다. 간단히 프로그램을 유지하기 위해 데이터를 변화시키고 푸리에 스펙트럼을 계산합니다. 이 스펙트럼은이 코드를 사용하여 파일에 기록됩니다 :idl 파일의 이상한 기호

openw,3,filename   
printf,3,[transpose(freq),transpose(power)],format='(e,e)' 
close,3 

파일은 다음이 코드를 사용하여 다른 프로그램에서 읽을 경우 : rdfloat 절차는 여기에서 찾을 수 있습니다

rdfloat,filename,freq,power,/double 

: http://idlastro.gsfc.nasa.gov/

을 파일을 읽으 려 할 때 오류가 발생했습니다 : "입력 변환 오류. 단위 : 101" 파일을 읽을 때 파고 들자면 몇 가지 유형의 인식 할 수없는 문자가 나타납니다. 파일 또는 300 개가 넘는 파일 수와 관련된 다른 글에 대한 결과인지 알 수 없음

이러한 기호는 하나의 숫자 대신에 사용됩니다 :

< dle> < dc1> < dc2> < dc3> < dc4> < can> < nak> < em> < soh> < syn> 

읽는 파일에 표시되는 내용의 예는 연속적인 행이 아니라는 점에 유의하십시오.

7.7346< dle>18165493007e+01 8.4796811549010105e+00 
7.7354408697119453e+01 1.04459538071< dc2>1749e+01 
7.7360701595839< can>28e+01 3.0447318983094189e+00 

파일을 쓰는 절차를 실행할 때마다 항상 이러한 문자의 일부 또는 전부를 포함하는 파일이 하나 이상 있습니다. 이러한 문자가 포함 된 파일은 항상 다릅니다.

누구나이 기호가 무엇인지, 내가 기호를 작성하기 위해 무엇을하고 있는지, 파일에 쓰지 않는 방법을 설명 할 수 있습니까?

답변

0

두 가지 문제점이 발생합니다. 하지만 먼저 몇 가지 팁을 제안하고자합니다.

파일을 열 때/GET_LUN 키워드를 사용하면 IDL이 사용할 수있는 LUN (논리 단위 번호)을 찾고 사용할 수 있으므로 유용합니다 (예 : LUN 3을 다른 곳에서 열어 둔 경우) . 서식이 지정된 데이터를 인쇄 할 때 너비와 소수 자릿수를 지정해야합니다. 파일에서 숫자 사이의 간격을 변경하는 것에 대해 걱정할 필요가 없기 때문에 더 쉽게 작업 할 수 있습니다.

그래서 나는 다음 (또는 다음의 몇 가지 변형)에 코드의 첫 번째 세트를 변경합니다 :

OPENW,gunit,filename[0],/GET_LUN,ERROR=err 
FOR j=0L, N_ELEMENTS(freq) - 1L DO BEGIN 
    PRINTF,gunit,freq[j],power[j],FORMAT='(2e20.12)' 
ENDFOR 
FREE_LUN,gunit ;; this is better than using the CLOSE routine 

그래서 내가 보는 첫 번째 잠재적 인 문제는 그 경우 변수 power 같은 것을 사용하여 계산 하였다 FFT.pro이면 입력 및 사용 된 키워드에 따라 복잡한 float 또는 complex double이됩니다.

두 번째 잠재적 인 문제는 잘못된 형식 문 때문일 수 있습니다. PRINTF에 예상 할 열이나 행의 수를 말하지 않았습니다. 입력을 올바르게 처리하는 방법을 모를 수도 있으므로 추측하여 사용자가 표시하는 문자가 나타날 수 있습니다. 이러한 문자는 막연한 형식 명령문이나 파일을 보는 데 사용하는 소프트웨어 때문에 공백 문자가 될 수 있습니다 (예 : Word를 사용하여 텍스트 파일을 열고 텍스트 편집기를 사용하지 않는 것이 좋습니다).

사이드 참고 : 당신은 열고 그냥 내가 위에서 보여 주었다 것과 비슷한 방식으로 작성한 파일을 읽을 수 있지만 다음과 같이 변경 할 수 있습니다

n = FILE_LINES(filename[0]) 
freq = DBLARR(n) 
power = DBLARR(n) 
OPENR,gunit,filename[0],/GET_LUN,ERROR=err 
FOR j=0L, N_ELEMENTS(freq) - 1L DO BEGIN 
    READF,gunit,freq[j],power[j],FORMAT='(2e20.12)' 
ENDFOR 
FREE_LUN,gunit ;; this is better than using the CLOSE routine