CSV ファイルとは、「, 」で区切られたデータである。 ここでは、数値,数値,数値 と 「,」で区切られたデータが並んでいる CSV ファイルを F77 で読み出す時に、よく問題になる非数値データ ((例えば **** などの欠測記号)の取扱いのサンプルをしめす。
プログラムの方針は、
parameter(num_x=10, num_data=1000)
integer num, ndata, err_read
character*1024 line
real x(num_x, num_data)
ndata = 1
err_read = 0
do while( (ndata.le.num_data).and.(err_read.eq.0) )
read(*,'(A)', err=999, end=999) line
call line2data( line, num_x,x, num,ndata)
write(*,*) num, (x(i,ndata), i=1,num)
goto 998
999 err_read=-1
998 continue
end do
do i=1,(ndata-1)
write(*,*), i, (x(j,i),j=1,num)
end do
stop
end
subroutine line2data( line, num_x, x, num,ndata)
character*1024 line
integer num, num_x,ndata
real x(num_x,ndata)
integer i, j, k, ch, n_line
character*1024 buf, delim, buf2
delim=','
j=1
ch=1
do i=1,len(line)
if(line(i:i) .eq. delim(1:1)) then
call conv_data( buf,1,j-1, x(ch,ndata) )
ch = ch+1
j=1
else
buf(j:j) = line(i:i)
j=j+1
endif
end do
call conv_data( buf,1,j-1, x(ch,ndata) )
num = ch
ndata = ndata +1
end
subroutine conv_data( buf, i1, i2, xx)
character*1024 buf
real xx
parameter (xmiss=-9999)
C write(*,*) 'buf=', buf(i1:i2)
read(buf(i1:i2), *, err=900) xx
goto 910
900 xx = xmiss
910 continue
end
サンプルソフトのページへ