前へ 上へ 次へ
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文を用い、
その後実際の読み込み処理を行なっています。
前へ 上へ 次へ