- ベストアンサー
FORTRANで二つのファイルの地点番号を抜き出すプログラムを書きたい
- FORTRANで二つのファイル(a.csv,b.csv)の地点番号を比較し、一致する場合に抜き出すプログラムを書きたいです。
- 現在、FORTRANで二つのファイル(a.csv,b.csv)の地点番号を比較し、一致する場合に抜き出すプログラムを作成しようとしていますが、途中でエラーが発生して困っています。
- FORTRANを使用して、a.csvファイルとb.csvファイルの地点番号を比較し、一致する場合に抜き出すプログラムを作りたいですが、エラーが発生しています。どうすれば解決できるでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> read(50,*) yea,mon,day,id,lon,lat,chiki,nam,pre,wind,winddirection,temp,& > & hightemp,lowtemp,sunlight,maxrain,maxwind > if(io < 0) exit これではファイルの最後まで読んだらエラーになるに決まってるよね。ioってなんだ?
その他の回答 (5)
- f272
- ベストアンサー率46% (8467/18126)
だいたいa.csvというファイルの中身はとてもcvsファイルだとは思えません。 とりあえず program test implicit none REAL :: number,code,year,name open(10,file='test4.csv',status='old') read(10,*) number,code,year,name write(*,*) number,code,year,name end これをどういう風に変更したらまともに動くようになるのか考えてください。
- Tacosan
- ベストアンサー率23% (3656/15482)
そこにエラーメッセージが書いてあるので, それを読んで理解すればいい. test4.csv なるファイルがどんなものかわからんので, 何がどうおかしいのかは自分で判断してくれ.
- Tacosan
- ベストアンサー率23% (3656/15482)
.... do の数をきちんと数えてください.
お礼
お返事が遅くなってすいません。 ん~、3つでもできませんでした。
補足
なんとかenddo3つでコンパイルできたのですが、実行できません。 At line 22 of file chiten.f90 (Unit 10 "test4.csv") Traceback: not available, compile with -ftrace=frame or -ftrace=full Fortran runtime error: Bad real number in item 4 of list input というエラーが出ます。書き順などが悪いのでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
なぜ enddo を「2個」書いたのですか?
お礼
doを2回使っているので。 ただ1個でも2個でも結果は同じでした。
- Tacosan
- ベストアンサー率23% (3656/15482)
do に対応する endodo はどこ? あと, なぜ stop のあとで close?
お礼
enddoを2回つけてcloseしても、enddoなしでも、同じエラーメッセージなのです。 implicit none REAL :: number,code,year,name REAL :: yea,mon,day,id,chiki,nam INTEGER :: lon,lat,pre,wind,winddirection,temp INTEGER :: hightemp,lowtemp,sunlight,maxrain,maxwind open(10,file='test4.csv',status='old',iostat=ie) do iwork=1976, 2008 write(yyyy,"(i4.4)") iwork open(50, file='hokkaido_daily_lonlat'//yyyy//'.csv', status='old', & & iostat=io) if (io < 0) cycle do i = 1, 99 read(10,*) number,code,year,name if(ie < 0) exit do ii = 1, 30000 read(50,*) yea,mon,day,id,lon,lat,chiki,nam,pre,wind,winddirection,temp,& & hightemp,lowtemp,sunlight,maxrain,maxwind if(io < 0) exit write(6,*) yea enddo enddo close(10) close(50) end
お礼
ありがとうございます。 test4.csvはa.csvのことで、実は、初めの質問で表示した中身と少し違いました。すみません。 区切りにカンマが入っています。これが、いつもの書き方と違ってくるのでしょうか? 初心者の僕には、まだ見当がつきません。
補足
すいません。気づきました。宣言文ですね。 文字列はcharacterなどに変えました。 ------------------------------------------------------------------------------- program test implicit none INTEGER :: number,code,year CHARACTER(2) :: name open(10,file='test4.csv',status='old') read(10,*) number,code,year,name write(6,*) number,code,year,name end ---------------------------------------------------------------------------------- 長いほうのprogramも気をつけて直したのですが、多少動きましたが、出力されたのは1976がずらっと出ただけでして、FORTRAN runtaime error: End of file というエラーになります。 どうかアドバイスください。 INTEGER :: number,code,year INTEGER :: yea,mon,day,id,chiki REAL :: lon,lat INTEGER :: pre,wind,winddirection,temp INTEGER :: hightemp,lowtemp,sunlight,maxrain,maxwind CHARACTER(4) :: yyyy CHARACTER(2) :: name,nam open(10,file='test4.csv',status='old',iostat=ie) do iwork=1976, 2008 write(yyyy,"(i4.4)") iwork open(50, file='hokkaido_daily_lonlat'//yyyy//'.csv', status='old', & & iostat=io) if (io < 0) cycle do i = 1, 99 read(10,*) number,code,year,name if(ie < 0) exit do ii = 1, 30000 read(50,*) yea,mon,day,id,lon,lat,chiki,nam,pre,wind,winddirection,temp,& & hightemp,lowtemp,sunlight,maxrain,maxwind if(io < 0) exit write(6,*) yea enddo enddo close(50) enddo close(10) end