• 締切済み

データの数を数えるfortran プログラム

横にm個、縦にn個の実数データが整然と並んでいます。ファイルを開いて読み込むのですが、縦横に何個のデータがあるかプログラムに感知させる方法があるでしょうか。 縦にn個のデータがあることは簡単でした。しかし横にm個あることを感知させるのが難しいです。今は、とにかく全データの個数を調べて、その個数をnで割って求めています。 全データを読む方はは、1個読んで巻き戻し、2個読んで巻き戻し、3個読んで巻き戻し、.... としてデータをこれ以上読めないというところまで読んでその個数が全データということになります。この部分がかなり時間を使います。データを開いてエディタで1行目のカラム数を数えればいいわけですが、プログラム的にはどうなるでしょうか。Cだったら、改行を感知させるという方法があるかもしれません。Fortranだったらどうなるでしょうか。 ※Fotranの専門の会議室がないのかなと思っていますが。

みんなの回答

  • f272
  • ベストアンサー率46% (8653/18507)
回答No.4

#2です。 len_trimは今時のコンパイラであれば組み込み関数として認識するはずです。Fortran 77ではなく90以降として書いてください。 どうしても77として書きたいのであれば print*, "# of columns in row 1 =", len_trim(line) の代わりに do 10 i=512,1,-1 if(line(i:i).ne.' ') goto 900 10 continue 900 print*, "# of columns in row 1 =", i としてください。

すると、全ての回答が全文表示されます。
回答No.3

> 改行を検出してそこで作業を止めるというのが必要かと思います。 ほんとですね。失礼しました。 方言の違いまでは把握していませんが、    CHARACTER*1 WCR,WFF,WFE    DATA WCR/Z0D/    DATA WFF/Z0C/ とかで宣言しておいてから、空白数を数えるDOループのなかで   IF (INDATA(LOOP:LOOP),EQ,WCR .OR. INDATA(LOOP:LOOP),EQ,WFF) GOTO ??? として、ループ脱出させてはどうでしょう。 それと、空白が1文字だけとは限らないなら、1文字 前が空白なら除外するように するとよいかと思います。 (もちろん、カンマ区切りのCSVだとロジック変わりますが)

すると、全ての回答が全文表示されます。
  • f272
  • ベストアンサー率46% (8653/18507)
回答No.2

私ならこんな感じ。 program length_row_column character(len=512) line read(*, '(a)') line print*, "# of columns in row 1 =", len_trim(line) nrow=1 do read(*, '(a)',end=999) line nrow=nrow+1 end do 999 print*, "# of row =", nrow end program length_row_column

skmsk1941093
質問者

お礼

回答ありがとうございます。4行目のlen_trim()という関数が未定義なのですが、どのような処理になるでしょうか。 後半は行数(縦方向)を数えますが、これはわかりやすいです。前半のカラム数(横方向)を数える方が難しいと思っています。

すると、全ての回答が全文表示されます。
回答No.1

> データを開いてエディタで1行目のカラム数を数えればいいわけですが これと同じことをプログラムで行えばよいのでは。 たとえば、1カラムの空白区切りなら、     CHARACTER*1024     READ(50.1000 ) INDATA 1000 FORMAT(A1024)     ICNT = 0     FOR 2000 LOOP=1,1024      IF (INDATA(LOOP:LOOP),EQ,' ') THEN       ICNT=ICNT+1      END IF 2000 CONTINUE みたいな感じで、1行目のみを数えてから ファイルをオープンし直すか、ファイル先頭に巻き戻して本番の読み込みさせるとか。 (Fortranの方言はいろいろあるので、あくまでもイメージですけど)

skmsk1941093
質問者

お礼

回答ありがとうございます。プログラムの趣旨に従って動作をさせてみました。F77で書いています。 CHARACTER*1024 INDATA open(50,file='data.txt') READ(50,1000 ) INDATA 1000 FORMAT(A1024) ! write(*,*) indata ICNT = 0 do i=1,1024 write(*,*) i,indata(i:i) ; pause IF (INDATA(i:i).EQ.' ') THEN ICNT=ICNT+1 END IF enddo close(50) write(*,*) icnt stop end 1024個を横方向に読んで、1文字1文字吟味していくということですね。 空白の数を数えるということになりますが、文字列のindataの中身はデータが終わって改行が来てもそれ以降もヌルになっているのでカウントしてしまうように思います。改行を検出してそこで作業を止めるというのが必要かと思います。すなわち、空白と改行を検知してそれに基づいてデータ数を推定するということが必要だと思いますが。改行をどうやって検知できるでしょうか。C言語の\nと思いますが。

すると、全ての回答が全文表示されます。

関連するQ&A