CSV ファイルとは、「, 」で区切られたデータである。
ここでは、数値,数値,数値 と 「,」で区切られたデータが並んでいる
CSV ファイルを読み出す時に、よく問題になる非数値データ ((例えば **** などの欠測記号)や、
カラム数が途中で変わっている場合の取扱いのサンプルをしめす。
2012年1月に、" " で囲まれた , を無視するように変更した。
プログラムの方針は、
! add " treatment 2011.Jan.12 ! implicit none integer, parameter :: maxch=12 character(len=1024) :: buf, eachcol(maxch) integer :: i, num read(*, '(A)') buf call devidecsv( buf, eachcol, maxch, num ) do i=1, num write(*,*) i, eachcol(i)(1:len_trim(eachcol(i))) end do end subroutine devidecsv( buf, eachcol, maxch, num ) implicit none integer :: maxch, num character(len=*) :: buf, eachcol(maxch) integer :: i, j, prev, now, now1, ll logical :: quote quote = .FALSE. ll = len_trim(buf) prev=0; now=1; i=1 do j=1, ll if( buf(j:j) == '"' ) then quote = .NOT. quote end if if( quote .eqv. .FALSE. ) then if(buf(j:j) == ',') then now = j now1 = now -1 if( now1 < prev+1 ) then eachcol(i) = '' else eachcol(i) = buf(prev+1:now1) end if i=i+1 if( i > maxch ) then write(0,*) 'maxch is too small' stop end if prev=now end if end if end do if( prev < ll ) then eachcol(i) = buf(prev+1:ll) num = i else num=i-1 end if endサンプルソフトのページへ