電子書籍の厳選無料作品が豊富!

FORTRANについての質問です。
現在、二つのファイル(a.csv,b.csv)を読んで,a.csvのファイル内の地点番号とb.csvのファイル内の地点番号が一緒なら抜き出すというプログラムを書きたいのですが、途中で抜け出せなくなってしまいました。下に使用しているファイルの中身を、ごくわずかですが載せておきます。
b.csvのほうは、年別で33個のファイルに分けられています。
----------------------a.csv------------------------------------------
30232261977大野
31133111978増毛
31141011978新篠津
31152511978芦別
31162811978真狩
31170761978興部
-----------------------------------------------------------------------
----------------------b.csv-------------------------------------------2006,1,1,11016,141.678,45.4147,3,稚内,0,33,16,-64,-51,-75,55,1,9
2006,1,1,11151,141.138,45.1767,14,沓形,1,20,1,-52,-36,-68,4,1,6
2006,1,1,11176,141.778,45.1017,12,豊富,0,9,4,-80,-51,-116,59,0,3
2006,1,1,11206,142.362,45.1117,13,浜頓別,1,12,13,-92,-47,-140,66,1,3
2006,1,1,11276,142.28,44.965,25,中頓別,0,5,11,-137,-44,-209,46,0,2
2006,1,1,11291,142.585,44.9397,7,北見枝幸,0,25,13,-70,-47,-94,70,0,6
2006,1,1,11316,142.48,44.84,14,歌登,0,2,1,-115,-49,-170,56,0,1
------------------------------------------------------------------------

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='a.csv',status='old',iostat=ie)


do iwork=1976, 2008
write(yyyy,"(i4.4)") iwork

open(50, file='b'//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

stop
close(10)
close(50)
end

エラーメッセージがenddo文が予期されている。プログラムのファイルのendが予期されていない。とでます。enddo文を足したりしても治りませんでした。おそらくどこか書き方が違うのでしょう。どうかアドバイスください。

A 回答 (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ってなんだ?
    • good
    • 0

だいたい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
これをどういう風に変更したらまともに動くようになるのか考えてください。

この回答への補足

すいません。気づきました。宣言文ですね。
文字列は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

補足日時:2010/08/30 21:37
    • good
    • 0
この回答へのお礼

ありがとうございます。
test4.csvはa.csvのことで、実は、初めの質問で表示した中身と少し違いました。すみません。
区切りにカンマが入っています。これが、いつもの書き方と違ってくるのでしょうか?
初心者の僕には、まだ見当がつきません。

お礼日時:2010/08/30 15:14

そこにエラーメッセージが書いてあるので, それを読んで理解すればいい.


test4.csv なるファイルがどんなものかわからんので, 何がどうおかしいのかは自分で判断してくれ.
    • good
    • 0

....


do の数をきちんと数えてください.

この回答への補足

なんとか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

というエラーが出ます。書き順などが悪いのでしょうか?

補足日時:2010/08/29 16:24
    • good
    • 0
この回答へのお礼

お返事が遅くなってすいません。

ん~、3つでもできませんでした。

お礼日時:2010/08/29 13:42

なぜ enddo を「2個」書いたのですか?

    • good
    • 0
この回答へのお礼

doを2回使っているので。
ただ1個でも2個でも結果は同じでした。

お礼日時:2010/08/27 05:47

do に対応する endodo はどこ?


あと, なぜ stop のあとで close?
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/08/26 16:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!