Fortran:列数の分からないデータの読み込み

このQ&Aのポイント
  • Fortranを使用して、列数の分からないcsvファイルを配列を用いて読み込むプログラムを作成。
  • 1次元配列を使用してデータを読み込んだ結果、1行目で行をまたいでデータが読み込まれてしまった。
  • 各行のデータだけを読み取る方法はあるか。プログラムの内容、入力データ、出力結果は次の通り。
回答を見る
  • ベストアンサー

Fortran:列数の分からないデータの読み込み

列数の分からないcsvファイルを想定して、配列を用いて読み込むプログラムを作成しようと考えています。 試しに十分に大きい1次元配列を用いてデータを読みこむプログラムを作成したところ 1行目読み込み時に行をまたいでデータを読み込んでしまいました。 なんとか、各行のデータだけを読み取る方法はないでしょうか? よろしくお願いします。 ちなみにプログラムの内容、入力データ、出力結果は次の通りです。 ・プログラム implicit none integer a(5),i open(10,file='a.csv',status='old') read(10,*)(a(i),i=1,5) write(*,*)(a(i),i=1,5) close(10) ・入力データ     1,2,3,4     5,6,7,8     9,1,2,3 ・出力結果     1 2 3 4 5

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

ちょっと強引かもしれないけど、 implicit none integer a(5),i character(80) line open(10,file='a.csv',status='old') read(10,'(a)') line read(line,*,end=1)(a(i),i=1,5) 1 write(*,*)(a(i),i=1,5) close(10) end

no171513
質問者

お礼

できました!ありがとうございます。

その他の回答 (1)

  • FEX2053
  • ベストアンサー率37% (7987/21354)
回答No.1

あの、単純に「5つ読め」って命令しちゃってるんじゃないかと? integer a(4),i : read(10,*)(a(i),i=1,4) write(*,*)(a(i),i=1,4)

no171513
質問者

お礼

回答ありがとうございます。 何列あるかどうか分からないデータを取り扱いので、 あえてデータの列数以上の読み込みをするように命令しました

関連するQ&A

  • FORTRAN77で・・・

    IMPLICIT NONE REAL A(50,50),B(50),X(50),EPS/1E-6/ INTEGER I,KP,N/4/,KPP/50/ DATA (A(1,I),I=1,4)/7.0,2.0,-1.0,1.0/ DATA (A(2,I),I=1,4)/1.0,5.0,1.0,-2.0/ DATA (A(3,I),I=1,4)/2.0,3.0,8.0,1.0/ DATA (A(4,I),I=1,4)/2.0,-2.0,-1.0,10.0/ DATA (B(I),I=1,4)/12.0,6.0,36.0,35.0/ ・・・・ という感じのリストでコンパイルするとREALとINTEGERの行で attempt to give DATAb in type-declaration というエラーが出るのですが、どう対処したらいいのかわかりません。 教えてください。

  • 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 のような読み込み方だと配列が大きすぎてだめなんです。 他の方法を知っている方、教えていただけませんか。 よろしくお願いします。

  • Fortran90/95の出力方法について

    Fortran90/95の出力方法について Fortran95において,変数の値をwrite文で出力した後に改行しない方法を教えてください. 具体的には次のProgram reiを用いて質問します. program rei implicit none integer i, n read(*,*) n do i = 1, n write(*,*) i end do end このプログラムを実行させnに3を代入すると次のように表示されます. 1 2 3 しかし,私としては次のように改行せずに表示させたいのです. 1 2 3 また,諸事情により配列は使用しません. プログラムをどのように改良すればよいのでしょうか.教えてください.

  • プログラミングの授業で Fortran 90/95 言語を使った 「計

    プログラミングの授業で Fortran 90/95 言語を使った 「計算機ソフトウェア」という授業があり,以下のような課題が出ました。 ファイルからデータを入力し,それに対して何らかの処理を行い,結果をファイルに出力する,Fortran 90/95 言語を使ったプログラムを作成する問題を自分で作り,その回答(プログラムリスト)を記述せよ。 ただし,以下の内容を満足すること。 ・入出力には書式を用いる ・配列を使用する ・DO文を使用する ・IF文を使用する ・関数またはサブルーチンを使用する ・レポートには,問題の説明と処理の方法の説明を書き,プログラムリストと結果の評価を添えること。 並みのプログラムではダメらしく,(アイデア的にも)素晴らしいプログラムを作らなければならないのですが,まったく良い案が思いつきません。 良かったら,何か,教授をあっと言わせるような,プログラムの案, もし良ければ,プログラムリストの内容(PROGRAM ○○  IMPLICIT NONE ~~~)を添えて回答いただけないでしょうか? どうか,よろしくお願いします。

  • 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で読み込んだ複数ファイルデータの見方

    また質問です。 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文を書くと最後に読み込んだファイルのデータしか見れません。どなたか教えてください。

  • fortran エラーについて

    fortranで、副プログラムを使ってデータを昇順または降順に並べ替えるプログラムを入力して実行しようとしたところ、 ・Unexpected junk in formal argument list at (1) ・Two main PROGRAMs at (1) and (2) という2つのエラーが出ました。 これらの改善方法を教えて頂きたいです。 初心者ですので簡単なところで間違えている可能性もありますが、ご指摘いただければ幸いです。 以下、実際に入力したプログラムです。 ------------------------------ implicit none integer::i,n real::x(1000),a(1000),b(1000) n=1000 open(10,file='input-data-1.txt') do i=1,n read(10,*) x(i) end do close(10) open(10,file='output-data-1.txt') do i=1,n call koukan(i,x(i),a(i),b(i)) write(10,'(i4,2f10.3)') i,a(i),b(i) end do close(10) stop end subroutine koukan(i,x(i),shoujun,koujun) implicit none integer::i,n,made real::x(1000),w,shoujun,koujun do made=n-1,1,-1 do i=1,made if(x(i)>x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do shoujun=x(i) do made=n-1,1,-1 do i=1,made if(x(i)<x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do koujun=x(i) return end ------------------------------

  • OleDbDataReaderでExcelデータの読み込み

    VB2008からExcelのデータを取得しようとしています。 上から1行づつ読み込み処理をします。 各行でデータの入っている列数が変わります。 今作ったファイルでは OleDbDataReaderのFieldCountが77になりました。 これを For cnt = 0 to rdr.FieldCount - 1 Debug.WriteLine(rdr.GetString(cnt)) next とやると1行目のcnt=6で落ちてしまいます。 メッセージは 指定されたキャストは有効ではありません。 です。 excelのデータは1行目はE列まで入っています。 もっと早くExcelからデータ読み込む方法であれば 他の方法でもかまいません。 どうやったら列数の違うシート全体を取込めるでしょうか?

  • fortran77教えてください

    fortran77の問題で次のプログラムの作成の仕方を教えてください 整数A,B,Cを読み込み、それを係数とする2次方程式Ax^2+Bx+C=0の解を計算して表示するプログラムを サブルーチン副プログラムを用いて作成せよ(複素数型を使うこと) メインプログラムでは整数A,B,Cの入力および解の出力および解の出力を行い解の計算はサブルーチン副プログラムで行うこと なお'keisan.txt'という名前のデータファイルに結果を出力するように 計算時は以下の3つの方程式を用いること x^2+3x+5=0 X^2+6x+4=0 x^2+x+1=0

  • 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 と出力されるようにしたいのです。 実際のデータや変数名も違いますが、プログラムの構造は同じです。 よろしくおねがいします。

専門家に質問してみよう