みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

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

投稿日時 - 2017-01-23 13:15:59

QNo.9284783

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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
としてください。

投稿日時 - 2017-01-27 11:00:30

ANo.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だとロジック変わりますが)

投稿日時 - 2017-01-27 09:36:25

ANo.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

投稿日時 - 2017-01-25 20:00:40

お礼

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

投稿日時 - 2017-01-27 06:46:11

ANo.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の方言はいろいろあるので、あくまでもイメージですけど)

投稿日時 - 2017-01-24 11:10:09

お礼

回答ありがとうございます。プログラムの趣旨に従って動作をさせてみました。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と思いますが。

投稿日時 - 2017-01-27 07:14:27

あなたにオススメの質問