我正在使用一个软件,它为我提供了一个.csv
文件,我想借助一个fortran代码阅读。 .csv
文件具有以下格式:
balance for 1. Unit: kg N/ha
___________________________________________________________________________________________________________________________________________________________________________
,N Pools,,,,,Influx N,,,,,Efflux N
Day,iniSON,iniSIN,endSON,endSIN,dSoilN,Deposit,Fertilizer,Manure,Litter,Sum-In...(**20 parameters**)
___________________________________________________________________________________________________________________________________________________________________________
1,5973.55, 20.20,5973.51, 20.23, -0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, -0.00, 0.00
.........
我有365行具有这样的值。
为了阅读第一行,我使用了以下内容:
program od
implicit none
integer :: res
character(LEN=200) :: head1,head2,head3,head4,head5
open(10, file="Balance_N_1.csv",access='sequential',form="formatted",iostat=res)
open(9,file="out.txt")
read(10,fmt='(A)', iostat=res) head1,head2,head3,head4,head5
write(9,*) head1,head2,head3,head4,head5
end program od
如何读取后面的数据并将它们放在矩阵中以便我可以使用某些值执行计算?
答案 0 :(得分:4)
如果我正确地读了你的问题你有一个包含365行数据的文件,每行有1个整数(日期编号)和20个实数,每行的值都是逗号分隔的。你可以像这样声明一个数据数组;
real, dimension(365,20) :: data_array
和整数变量,如
integer :: line_no
然后,一旦您阅读或跳过文件顶部的文本行,您就可以像这样读取数组:
do ix = 1,365
read(10,*) line_no, data_array(ix,:)
end do
使用*
作为read语句中的格式,您正在使用 list-directed 输入,这种输入快速简便但有限。但是,如果您的数据文件干净且一致,则应该足够好。
如果列表导向输入不起作用,您将不得不使用编辑描述符,类似这样的内容(未经测试)
read(10,'(i4,20f9.4)') line_no, data_array(ix,:)