7

我正在使用一个软件,它给我一个输出.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

如何读取后面的数据并将它们放入矩阵中,以便我可以使用某些值执行计算?

4

1 回答 1

9

如果我没看错你的问题,你有一个包含 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 语句中使用 for 格式,您正在使用列表导向的输入,这种输入既快速又简单,但有些受限。但是,如果您的数据文件干净且一致,这应该足够了。

如果列表导向输入不起作用,您将不得不使用编辑描述符,像这样(未经测试)

read(10,'(i4,20f9.4)') line_no, data_array(ix,:)
于 2013-06-26T16:57:51.073 回答