今だけ! NAG Fortran コンパイラ 
大学生協様限定 年度末キャンペーン実施中! 
 詳細は 大学生協様専用URL からどうぞ 
Fortran Builder Logo
Fortran Builder
関連情報

ナビゲーション:前へ   上へ   次へ

12 CSVファイルを読む方法

ここではFortranでCSVファイルを読む方法を説明します。

12.1 最もシンプルなCSVファイルの場合

シンプルなCSVファイルであれば比較的簡単に読み込むことができます。 特にあらかじめレコード数(行数)がわかっていて且つ数値だけで構成される以下の例のようなCSVファイルは簡単に読み込むことが可能です。
X,Y,Z
1.2,3.4,5.0
2.2,3.3,6.2
0.3,2.1,5.98
4.2,3.6,1.25
5.03,2.3,3.44
上記CSVデータを読み込むプログラム例を以下に示します。

[ read-simple-csv.f90 ] - シンプルなCSVファイルを読み込むサンプル

program readSimpleCSV
  implicit none
  integer, parameter :: n = 5
  real x, y, z
  integer i
  open (17, file='mydata.csv', status='old')
  read (17, '()')       ! ヘッダ行の読み飛ばし
  do i = 1, n
    read (17, *) x, y, z
    print *, x, y, z
  end do
  close (17)
end program readSimpleCSV
実行例:
   1.2000000   3.4000001   5.0000000
   2.2000000   3.3000000   6.1999998
   0.3000000   2.0999999   5.9800000
   4.1999998   3.5999999   1.2500000
   5.0300002   2.3000000   3.4400001
ここでのポイントはread文の書式に * を指定している事です。 これにより CSV 形式のデータを簡単に読み込む事ができています。

ヘッダ行の読み飛ばしは以下のように行う事ができます。

  read(装置番号,'()')

12.2 レコード数があらかじめわかっていないCSVファイルの場合

前述の例ではあらかじめCSVファイルのレコード数(行数)がわかっている事が前提でしたが、 場合によってはファイルを読み込むまでレコード数がわかっていない場合もあります。

ここで示すプログラムは以下のデータ(前述と同じデータ)を読み込みますが、 あらかじめレコード数(行数)がわかっていない場合に対応したものです。

X,Y,Z
1.2,3.4,5.0
2.2,3.3,6.2
0.3,2.1,5.98
4.2,3.6,1.25
5.03,2.3,3.44
上記のようなデータのレコード数がわかっていない場合でも下記のコードで読み込みが可能です。

[ read-unknown-csv.f90 ] - レコード数がわかっていないCSVファイルを読み込むサンプル

program readCSV
  implicit none
  integer n
  real x, y, z
  integer i
  open (17, file='mydata.csv', status='old')
  ! === レコード数を調べる ===
  n = 0
  read (17, '()')
  do
    read (17, *, end=100) x, y, z  ! ファイル終端ならば999に飛ぶ
    n = n + 1
  end do
100 continue
  rewind (17)  ! ファイルの最初に戻る
  print *, 'NumRec =', n
  ! === 読み込む ===
  read (17, '()')
  do i = 1, n
    read (17, *) x, y, z
    print *, x, y, z
  end do
  close (17)
end program readCSV
実行例:
 NumRec = 5
   1.2000000   3.4000001   5.0000000
   2.2000000   3.3000000   6.1999998
   0.3000000   2.0999999   5.9800000
   4.1999998   3.5999999   1.2500000
   5.0300002   2.3000000   3.4400001
このコードではまず最初にレコード数を調べます。ここでのポイントはread文のend=指示子です。
read(17,*,end=999) x, y, z
この記述によりファイルの終端を検出し、もうこれ以上データがない場合に文番号 999 へジャンプします。

レコード数がわかった時点でファイルを最初から再度読みなおすためにrewind文を用い、 その後実際の読み込み処理を行なっています。


ナビゲーション:前へ   上へ   次へ

Results matter. Trust NAG.
Privacy Policy | Trademarks