2013-02-28 134 views
0

我有一個文件看起來像這樣:Fortran語言:格式化讀

startSpecifier 

( 251)-0.0110365 ( 168)-0.0110365 (1267) 0.0108601 ( 980) 0.0108601 (

( 251)-0.0110365 (

endSpecifier 

我不知道格式,每行多久重複infile中。

我需要得到陣列看起來像這樣(在上面的示例):

a=[251, 268, 1267, 980, 251] 
b=-0.0110365, -0.0110365, 0.0108601,...] 

任何建議,如何解決這個問題?

回答

0

我會用

do line = 1,nlines !or just do and exit on end of file, it's up to you 
    lower = (line-1)*items_per_line + 1 
    upper = line*items_per_line 
    read (unit,fmt='(999(tr1,i5,tr1,f11))') (a(i),b(i),i=lower,upper) 
end do 

添加任何其他read(unit,*)跳過線,其中apropriate。

如果字段寬度確實是固定的,就像從您的示例中看到的那樣。

+0

不幸的是,我不知道我期望有多少領域,所以我不知道「上」。該文件中的行是否有問題? – user1638145 2013-02-28 12:14:32

+0

對於換行符,您只需執行另一個相同的讀取語句。 'lower'是數組索引,讀取的是最後一個+1(開頭爲1),'upper'是最後一個讀取的索引+行上的項目數。無論如何,您應該知道要讀取的項目數,因爲您的數組必須事先分配。 – 2013-02-28 12:52:33

+0

但我不知道itemp_per_line ... – user1638145 2013-02-28 13:14:59

0

在我oppinion,你有兩種基本選擇:

  • 您程序的Fortran鏈表,逐行讀取文件中的行,解析線和您提取的元素添加到您的鏈接列表。閱讀完成後,將鏈接列表轉換爲數組。我們在DFTB+中讀取未知長度的用戶數據時這樣做,但這需要不少的編程。

  • 或者,您可以使用腳本語言從輸入文件中提取數據並以更易於使用Fortran的格式進行存儲。下面在Python的例子,但是你可以使用你選擇的任何其他的腳本語言:

    from __future__ import print_function 
    import sys 
    import re 
    
    PAT1 = re.compile(r"\(\s*(?P<int>\d+)\)") 
    PAT2 = re.compile(r"\)\s*(?P<float>-?\d+\.\d+)\s*\(") 
    
    txt = sys.stdin.read() 
    ints = PAT1.findall(txt) 
    floats = PAT2.findall(txt) 
    
    print(len(ints)) 
    print(" ".join(ints)) 
    print(" ".join(floats)) 
    

    Store中的腳本convert.py並運行它想:

    python convert.py <mydata.dat> newdata.dat 
    

    ,我認爲,你的數據存儲在mydata.dat。新的文件newdata.dat
    會再看看這樣的:

    5 
    251 168 1267 980 251 
    -0.0110365 -0.0110365 0.0108601 0.0108601 -0.0110365 
    

    這可以用Fortran語言閱讀整在第一線, 輕鬆地分析分配你的整數 和浮點數組在它給出的大小,用兩個讀取 語句讀入兩個數組。