2014-05-08 6 views
0

파일에서 많은 양의 데이터를 읽고 다른 형식으로 다시 쓰는 fortran 프로그램과 함께 작업하고 있습니다.fortran의 파일에서 변수 읽기.

내가 데이터를 읽기 위해 사용하고 코드는 다음과 같습니다

10 read(10,*,err=11,end=20) f,time(i),(a(i,j),j=1,14) 
    ... 
    goto 10 
11 i=i+1 
    goto 10 

그것은 작동하지만, 입력 파일이 올바른지 경우에만 사용할 수 있습니다. 그러나 일부 라인은 다음과 같습니다

"2014-04-28 07:51:18.9",2705,-8.42144,6.623851,0.4654102,20.99942,"NAN","NAN",0,0,0,0,-9.0605,5.8855,0.4135,21.39728 

이 내가 NAN 다음 줄에 모든 가치를 잃게 발생합니다. 다른 값을 읽을 수있는 방법이 있습니까?

모든 값을 문자열로 읽은 다음 두 배로 변환 할 수 있습니까? 포트란에 관해서는 거의 알지 못하므로 빨리 고칠 필요가 있습니다. C에서 모든 것을 다시 작성하는 것은 너무 많은 시간이 걸릴 수 있습니다.

+0

C에서 빠른 파서를 작성하여 파일을 정리할 수 있습니까? 포트란에서 파일을 정리합니까? 어떻게하는지 알 것 같고 모든 코드를 다시 작성하는 것을 포함하지 않습니다. – Floris

+0

이것은별로 좋은 생각이 아닙니다. 데이터는 이미 3 개의 프로그램을 통해 실행되어야하며 프로세스에 다른 단계를 추가하고 싶지 않습니다. 어쨌든 팁 주셔서 감사. – protas

답변

3

예, 전체 줄을 문자열로 읽을 수 있습니다. 그런 다음 문자열을 구문 분석하고 "NAN"을 큰 음수 값과 같은 특수 숫자 값으로 바꿉니다. 내장 함수는 예를 들어 index과 같이 도움이 될 수 있습니다. 그런 다음 "내부 읽기"를 사용하여 문자열에서 숫자 변수로 읽습니다.

은 참조 : Reading comment lines correctly in an input file using Fortran 90, Reading format in Fortran 90Prevent FORTRAN from closing when a character is inputed instead of a number

+0

쉬운 방법이없는 것처럼 보입니다 ... 전체 줄을 문자열로 읽고 더 작은 문자열로 나누어 하나씩 차례로 변환해야합니다. 포트란에서 어떻게해야할지 모르겠다. 힘들지는 않기를 바란다. 도움을 주셔서 감사합니다, 나는 내일 그것을 시도 할 것입니다. – protas

0

내가 작업을 얻었다. 코드는 다음과 같습니다.

10 read(10,'(a)',err=16,end=20) linha 
     linha=trim(adjustl(linha)) 
     pos1=1 
     n2=0 
     DO 
     pos2 = INDEX(linha(pos1:), ",") 

     IF (pos2 == 0) THEN 
     n2 = n2 + 1 
     strings(n2) = linha(pos1:) 
     EXIT 
     END IF 
     n2 = n2 + 1 
     strings(n2) = linha(pos1:pos1+pos2-2) 
     pos1 = pos2+pos1 
     END DO 

     f=strings(1) 
     read(strings(2),*) time(i) 

     j=1 
    11 read(strings(j+2), *,err=12) a(i,j) 
     j=j+1 
     IF (j > 14) THEN 
     goto 13 
     END IF 
     goto 11 

    12 a(i,j)=9999 
     j=j+1 
     goto 11 

    13 IF (a(i,6)==9999) THEN 
     goto 14 
     END IF 
     pp=1000. 
     c1=0.622 
     c2=1.-c1 
     rv=461.5 
     e=0.001*a(i,6)*rv*(a(i,4)+273.15) 
     a(i,6)=1000*e*c1/(100*pp-c2*e)  
    14 IF (a(i,5)==9999) THEN 
     goto 15 
     END IF 
     mimol=a(i,5)/44 
     a(i,5)=mimol*83.14*(a(i,4)+273.15)/pp 
    15 i=i+1 
     n=i-1 
     if (i.gt.nmax) goto 20 
     goto 10 

    16 i=i+1 
     goto 10 

감사합니다.