2014-05-08 136 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 

當發生這種情況我在南線之後失去的每一個值。有沒有辦法讀取其他值?

它可以讀取每個值作爲一個字符串,然後將它們轉換爲雙打? 我對fortran知之甚少,需要快速修復它。用C重寫所有內容可能會花費太多時間。

+0

你可以在C中編寫一個快速解析器來清理文件,這個過程在Fortran中是乾淨的文件嗎?聽起來你會知道如何做到這一點,它不涉及重寫所有的代碼... – Floris

+0

這不是一個好主意。數據必須通過3個程序運行,我不想在此過程中再添加一個步驟。無論如何感謝提示。 – protas

回答

3

是的,您可以將整行讀入字符串。然後解析字符串,並用一些特殊的數值(如大的負值)替換「NAN」。內在功能可以幫助,例如index。然後使用「內部讀取」從字符串中讀取數字變量。

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

+0

看起來有沒有一種簡單的方法來做到這一點......我將不得不將整行讀入一個字符串,將它分解爲更小的字符串並逐個將它們轉換爲浮動。我不知道如何在fortran中做到這一點,我希望它不是很難。感謝您的幫助,我明天會嘗試。 – 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 

感謝您的幫助。