1

fortranを使用して、別の商用パッケージにインポートするためのコンマ区切りファイルを書き出そうとしています。問題は、データ列の数が不明なことです。私の出力は次のようになる必要があります:

a_string,a_float,a_different_float,float_array_elem1,float_array_elem2,...,float_array_elemn

これにより、次のようになります。

L1080,546876.23,4325678.21,300.2,150.125,...,0.125
L1090,563245.1,2356345.21,27.1245,...,0.00983

私には3つの問題があります。1つは、要素を厳密にグループ化すること(可変の列幅)、2つは、formatステートメントで可変数の配列要素を定義する方法がわからないこと、3つは、配列要素が広い範囲に及ぶ可能性があることです。多分12桁。次のコードは概念的には私が望むことを実行しますが、変数'n'と列幅の定義がないため、エラーが発生します(もちろん)。

WRITE(50,900) linenames(ii),loc(ii,1:2),recon(ii,1:n)
900 FORMAT(A,',',F,',',F,n(',',F))

(nは実行時に固定されることに注意してください。)writeステートメントは、幅で区切られていることを除いて、WRITE(50、*)を実行するときに必要な処理を実行します。

このスレッドは私の質問にほとんど答えたと思いますが、私はかなり混乱しました:SO。現在、問題を修正するawkを備えたシェルスクリプトがありますが、その解決策は...不適切です。出力を文字列にするための操作を行ってから、それを書き込むこともできますが、可能な限りそのオプションは避けたいと思います。

私はこれをFortran90で行っていますが、コードを可能な限り下位互換性を保つようにしています。

4

2 に答える 2

2

必要な形式に近い形式はf0.3です。これにより、スペースがなくなり、小数点以下の桁数が固定されます。末尾のゼロも削除したい場合は、かなりの作業を行う必要があると思います。

書き込みステートメントの「n」はデータ値の数よりも大きくなる可能性があるため、1つの(古い学校の)アプローチは、そこに大きな数、たとえば100000を置くことです。現代のFortranには、無期限の繰り返しを指定する構文があります。誰かがそれを提供することを確認してください。

----無制限のリピートを編集するのは、アスタリスクを推測するかもしれませんが、f2008では明らかに「真新しい」です。

于 2013-02-27T18:28:09.423 に答える
1

行のエントリ間にスペースが発生しないようにするために、文字変数に個別に記述してからadjustl()、fortranの関数を使用して出力することができます。

program csv
  implicit none

  integer, parameter :: dp = kind(1.0d0)
  integer, parameter :: nn = 3
  real(dp), parameter :: floatarray(nn) = [ -1.0_dp, -2.0_dp, -3.0_dp ]
  integer :: ii
  character(30) :: buffer(nn+2), myformat

  ! Create format string with appropriate number of fields.
  write(myformat, "(A,I0,A)") "(A,", nn + 2, "(',',A))"
  ! You should execute the following lines in a loop for every line you want to output
  write(buffer(1), "(F20.2)") 1.0_dp  ! a_float
  write(buffer(2), "(F20.2)") 2.0_dp  ! a_different_float
  do ii = 1, nn
    write(buffer(2+ii), "(F20.3)") floatarray(ii)
  end do
  write(*, myformat) "a_string", (trim(adjustl(buffer(ii))), ii = 1, nn + 2)

end program csv

上記のデモンストレーションは1つの出力ラインのみを対象としていますが、適切なブロックの周りにループを簡単に記述して、すべての出力ラインに対して実行することができます。また、必要に応じて、エントリごとに異なる数値形式を選択できます。

于 2013-02-27T19:41:54.203 に答える