1

次のようなファイルがあります。

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,...]

問題に取り組む方法について何か提案はありますか?

4

2 に答える 2

1

私の意見では、基本的に 2 つのオプションがあります。

  • Fortran で連結リストをプログラムし、ファイルを 1 行ずつ読み取り、行を解析して、抽出した要素を連結リストに追加します。読み取りが終了したら、連結リストを配列に変換します。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))
    

    スクリプトを 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
    

    これは、最初の行の整数を読み取り、整数と浮動小数点配列を指定されたサイズに割り当て、2 つの read ステートメントで 2 つの配列を読み取ることで、Fortran で簡単に解析できます。

于 2013-02-28T19:23:17.967 に答える
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,*)適切な行をスキップするには、その他を追加します。

あなたの例から見えるように、フィールド幅が本当に固定されている場合。

于 2013-02-28T11:14:11.400 に答える