• 締切済み

fortranで読み込んだ複数ファイルデータの見方

また質問です。 character (13) :: fname do i = 1 , 3 write (fname ,"('sample_' , i2.2 , '.csv ')") , i enddo open (10 , file = fname) close (10) end fortranで連番のcsvファイルを上記のプログラムで読み込ませることはできたのですが、それぞれのファイルのデータの見方が分かりません。装置番号10でread文やwrite文を書くと最後に読み込んだファイルのデータしか見れません。どなたか教えてください。

みんなの回答

回答No.2

ファイル名を格納する変数はfname1つしかない。 fnameにファイル名を入れているが、作成したファイル名を使用する前に、すぐ次のファイル名を入れている。(変数は上書きされる) よって、最終的にfnameには最後のファイル名しか入っていない。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

読み込んだデータをおぼえておけばいい.

関連するQ&A

  • Fortranのエラー

    お世話になります。 Fortran初心者です。 いまFortranでcsvファイルからデータを読みこむといったプログラムを作成しようと思っております。 まず、行いたいことは、複数のcsvファイル(0001.csv→0004.csvなど)のデータをプログラムに読込ませたいのですがうまくいきません。 0001.csvや0002.csvとしたいのに、INNAME.csvとなってしまいます。 なので、次に0001.csvだけを指定してたのですが下のデータを全く読み込んでくれません。 ちなみに0001.csvは、このようなデータです。 0,0,-107.75939 ,-85.57285 ,0.00000 ,0.00000 ,0.00000 ,0.00000 1,0,-105.54305 ,-85.56864 ,0.00000 ,0.00000 ,0.00000 ,0.00000 2,0,-103.32661 ,-85.56443 ,0.00000 ,0.00000 ,0.00000 ,0.00000 3,0,-101.11009 ,-85.56022 ,0.00000 ,0.00000 ,0.00000 ,0.00000 - 7325,0,106.16862 ,80.19408 ,0.00000 ,0.00000 ,0.00000 ,0.00000 エラーの部分としては、 READ(j,*) x,y,xmm,ymm,U,V,W,Length であり、エラーが出て、ファイルを読んでくれません。  エラーは Invalid character in fieldと出て、readする書式が違うのかと 自分なりに原因を探し変更してみたのですがわかりませんでした。 みなさまお忙しいところ本当にすみません。 初心者なのでどこかつまづいているかもしれないのですが、それがわかりません。 ご教授頂けたら幸いです。 よろしくお願い致します。 プログラム全体だと長いので 以下がプログラムのはじめから途中までの中身です。 PROGRAM MAIN Implicit None INTEGER i,j,k,sample,x,y CHARACTER*4 INNAME       REAL xmm,ymm,U,V,W,Length DIMENSION x(7326),y(7326),xmm(7326),ymm(7326) & ,U(7326),V(7326),W(7326),Length(7326) i=1 j=1 x=0 y=0 WRITE(INNAME,'(I4.4)') j WRITE(*,*) INNAME !!変数INNAMEに返す値は0001です。 OPEN(j, file='0001.csv') !!'//INNAME//.csv'だとINNAME.csvに。0001.csv,0002.csvにしたい。 c !-- read data sample=7326 DO k=i,sample READ(j,*) x,y,xmm,ymm,U,V,W,Length !!READがうまくいかない。Invalid character in fieldのエラー ENDDO

  • fortranのデータ読み込み

    fortranで下記の読み込みたいデータがあります。 j k R(j,k) L(j,k) 1 1 5 1 1 2 10 2 1 3 15 3 1 4 20 4 2 1 25 5 2 2 30 6 データが9000行あるので, do i=1,9000 read(10,*) j(i) k(i) enddo のような読み込み方だと配列が大きすぎてだめなんです。 他の方法を知っている方、教えていただけませんか。 よろしくお願いします。

  • ループ回数を、保存するファイル名に入れる方法

    FORTRANで、ループする毎に異なるファイルにデータを保存するプログラム(ファイル名の中にループ回数入れたい)を組みたいと思っており、自分で調べて、FORTRAN90なら例えば character*32 roop do i=1,100 write(roop,*)i open(1,FILE='file_'//adjustl(trim(roop))//'.dat') write(1,*)data close(1) enddo というようにwrite文で文字型変数に変換し、adjustlとtrimを使って余分な空白を取り除いて、//で結合すれば実現できることはわかったのですがこれと同じ事をFORTRAN77でやりたいと思っています。 困っているのはadjustlとtrimの部分をFORTRAN77で実現するところなのですが、なにかよい方法はありませんでしょうか? どうぞよろしくお願いいたします。

  • Fortran99で複数ファイルの読み込み

    Fortran99で有限要素法の解析プログラムを作成しています。 要素番号と節点番号、各節点の座標を三次元の配列にまとめて格納したく、 複数のcsvファイルを相互に参照しながら配列に読み込みたいと思っていますが、 その方法が分かりません。 具体的には、一つ目のファイル(ex1.csv)の中身が、 1 1 2 10 11 20 21 30 31 2 2 3 11 12 21 22 31 32 3 3 4 12 13 22 23 32 33 ........ と配列になっており、1列目が要素番号、2~8列目が節点番号としています。 二つ目のファイル(ex2.csv)の中身が、 1 0 0 0 2 5 0 0 3 10 0 0 4 15 0 0 5 20 0 0 ..... となっており、1列目が節点番号、2~4列目がそれぞれ、x, y, z座標となっています。 一つ目のファイルは、 open(10, file = 'ex1.csv', status = 'old', action = 'read', position = 'rewind') do ELEM = 1, MAXELEM read(10, *) (ELEMDATA(ELEM, m, 1), m = 1, 8) enddo close(10) と書き、全ての要素と節点番号を三次元配列の一、二次元目に読み込みました。 次に、ex1.csvの節点番号(2~8列目)の番号を読み取り、その番号をex2.csvの1列目 から探し出して、配列の三次元目に格納したいと思っています。 宜しくお願い致します。

  • FORTRANについての質問です。

    FORTRANについての質問です。 現在、二つのファイル(a.csv,b.csv)を読んで,a.csvのファイル内の地点番号とb.csvのファイル内の地点番号が一緒なら抜き出すというプログラムを書きたいのですが、途中で抜け出せなくなってしまいました。下に使用しているファイルの中身を、ごくわずかですが載せておきます。 b.csvのほうは、年別で33個のファイルに分けられています。 ----------------------a.csv------------------------------------------ 30 23226 1977 大野 31 13311 1978 増毛 31 14101 1978 新篠津 31 15251 1978 芦別 31 16281 1978 真狩 31 17076 1978 興部 ----------------------------------------------------------------------- ----------------------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文を足したりしても治りませんでした。おそらくどこか書き方が違うのでしょう。どうかアドバイスください。

  • 【fortran77】空行を含む数値データの読み込み

    fortran77でプログラムを書いています。 いま以下のような空行を含むデータファイルを読み込んで、プログラム中で計算し、その結果を別のファイルに書き出すものを作りたいと考えています。 1.0 1.1 1.2 1.3 1.0 1.4 1.5 1.6 2.0 2.1 2.2 2.3 2.0 2.4 2.5 2.6 3.0 3.1 3.2 3.3 3.0 3.4 3.5 3.6 *数字はあくまでも例です。 例えば、1列目が2.0で始まる箇所のみ取り出したいのですが、どうもデータの読み込みのところでエラーが起こっているようです。 open(1,file="data.dat") do i = 1,8 read(1,*) (a(i,j),j=1,4) enddo 空行や空白の読み飛ばしを行う方法を自分なりに調べてみて、open文にblankを指定するなどの方法があることはわかったんですが、いまいち使いかたがわからず立ち止まってしまいました。 よろしくお願いします。

  • fortranについての質問です。

    fortranについての質問です。 このFortranは、頭にそれぞれ14161~14163とつく33個のファイル(1/1~12/31,欠損地あり1年分)を読んでいき、例えば1/1、1/2…と365日分の33年の平均値を導くはずなのですが、下のようなエラーがでます。おそらく、14161が2008までないからではないかと思うのですが、現在勉強中なので、なにかアドバイス、おかしいところ修正できるところがありましたらお願いします。 program sapporo_kikouchi    INTEGER :: sum, no, point INTEGER :: year, mon, day, data INTEGER :: doy REAL,dimension(365) :: temp, ndata REAL :: lon, lat CHARACTER*4 yyyy CHARACTER*5 sssss ndata(:)=0.0 temp(:)=0.0 do ispot=14161,14163 write(sssss,"(i5)") ispot do iwork=1976, 2008 write(yyyy,"(i4.4)") iwork open(50, file=''//sssss//'_temp'//yyyy//'.csv', status='old') ! write(6,*) ispot iwork    do i = 1,366 read(50,*,iostat=io) id,year,mon,day,lon,lat,data if(io < 0) exit if(mon==2 .AND. day==29) then cycle endif call date2doy(year,mon,day,doy) temp(doy) = temp(doy) + data/10.0 ndata(doy) = ndata(doy) + 1 end do close(50) enddo !!! end of year loop enddo do i=1,365 if( ndata(i) == 0 ) then temp(i) = -99999.9 else temp(i)=temp(i)/ndata(i) endif write(6,*) i, temp(i), ndata(i) enddo stop end program subroutine date2doy(iy,im,id,idoy) INTEGER,dimension(12) :: nday INTEGER :: uruu !!uruu=1: うるう年、uruu=0: 通常の年 uruu=0 DATA nday /31,28,31,30,31,30,31,31,30,31,30,31/ if(mod(iy,4)==0 .AND. mod(iy,100)/=0) then uruu=1 endif if(mod(iy,1000)==0) then uruu=1 endif !! うるう年も無視する itotal = 0 if( im /= 1 )then do m=1, im-1 itotal = itotal + nday(m) enddo endif idoy = id + itotal ! write(6,*) iy,im,id, idoy return end ------------------------------------------------------------------------------ At line 18 of file kikouchi.f90 file: "14161_temp1993.csv" Traceback: not available, compile with -ftrace=frame or -ftrace=full Fortran runtime error: 指定されたファイルが見つかりません。 -------------------------------------------------------------------------------

  • fortranで疑問

    今fortranで困ったことがあります。 例えば 1 2 3 と縦に改行されているファイルを、新しいファイルに同じ数値データを写したいとき 元のデータから read(*,*)(n,i=1,3) で値を読み込み write(*,*)(n=i,3) で新しいデータに書き込み出来る と思ったのですが 3 3 3 と新しいファイルに書き込まれてしまうのです。 まず縦に改行した形で表示するにはどうしたら良いでしょうか? ちなみにdo~continue文でプログラムするとうまくいきます。

  • fortran77で複数のファイルの読み込み

    fortran77で複数のファイルの読み込み 現在fortran77のプログラムを勉強しております。 ファイルが複数あり、すべてのファイルを読み込みたいのですが、ファイルの数がたくさんあるため、プログラムの行数が多くなってしまいます。 do ループで次々とファイルを開くプログラムを考えているのですが、思いつきません。 どなたか考え方でもいいので、教えてください。 ちなみに私が考えたプログラムは、 open(10,file='C:\FORTRAN\100.txt',status='old') open(11,file='C:\FORTRAN\121.txt',status='old') open(12,file='C:\FORTRAN\144.txt',status='old') open(13,file='C:\FORTRAN\169.txt',status='old') open(14,file='C:\FORTRAN\196.txt',status='old') open(15,file='C:\FORTRAN\225.txt',status='old') ・・・。 これを do ループで次々に開くことを考えると、 character*3 A(10) do 100 i=1,10 A=i*i open(i,file='C:\FORTRAN\A.txt',status='old') 100 continue ・・・ みたいな感じです。 ' 'の中の一部だけを変えたい場合のcharacter 文の使い方がいまいちよく分かりません。

  • Fortranの出力の改行について

    Fortran超初心者です。 test1.csvのファイルには、x,yの変数がずっと続いています。 test2.datのファイルには、a,bの変数がずっと続いています。 この2つのファイルの変数を元に、d,eの値を求め、それをtest3.csvというファイルに出力したいのです。 test1.csvとtest2.datの計算はできていたのですが、test3.csvの出力は最後の計算結果のみしか出力されていません。 多分毎回出力はしているのですが、計算を繰り返すと上書きされ消えてしまうという仕組みになっているのだと思います。 どうやったら上書きされずに、csvファイルの次の行に次のデータを入力できますか? 以下私が考えたFortran90のプログラムです。 open (10, file='test1.csv', status='old')  do   read (10, *, iostat=ios) x, y   open (11, file='test2.dat', status='old')   do    read (11, *, iostat=jos) a, b    d = x +a    e = y + b    if (jos .lt. 0) exit   enddo   open (12, file='test3.csv', status='replace')   write (12, *) x, y, a, b, d, e   close (12)   close (11)   if (ios .lt. 0) exit  enddo close (10) 本当に始めたばかりで、いまいち意味の分かっていない部分もあるのですが、問題点を指摘してくれたら助かります。 わかりにくいので、具体的に少し書くと、 test1.csvには 1,2 9,3 6,4 とデータが続くとします。 test2.datには 80,50 10,20 90,60 とデータが続くとします。 test3.datには 1,2,80,50,81,52 1,2,10,20,11,22 1,2,90,60,91,62 9,3,80,50,89,53 9,3,10,20,19,23 9,3,90,20,99,23 6,4,80,60,86,64 6,4,10,20,16,24 6,4,90,20,96,24 と出力されるようにしたいのです。 実際のデータや変数名も違いますが、プログラムの構造は同じです。 よろしくおねがいします。