如何从矩阵文本文件中读取特定的列?不读整行?

时间:2019-05-02 15:10:29

标签: fortran fortran95

我有一个包含行数的文本文件,每行有899个值/列,中间用';'分隔(但我可以根据需要更改分隔符)

有没有一种方法可以读取已定义的列(我想告诉代码(每个读取的列))而不将整行都读取为变量?

所以我知道的是:read(unit,*)a,b,c,d,e,...(899次并不酷) 否则,我会将所有这些值放在一个数组中。在我可以用以下内容阅读我的专栏:array(i,icolumn)

我想要直接的方法。

2 个答案:

答案 0 :(得分:1)

如果您知道数字在字符165处,则只需使用ttrx描述符移动到那里并读取数字

read(unit,'(t165,f12.0)' array(whatever)

如果需要将数字165放入格式字符串中,则可以使用this function

答案 1 :(得分:0)

我的数据文件testdata.dat如下:

2.75420e+002;2.75327e+002;2.75281e+002;2.75178e+002;2.75052e+002;2.74908e+002;2.74847e+002;2.74761e+002;2.74689e+002;2.74497e+002
2.75420e+002;2.75327e+002;2.75281e+002;3.75178e+002;2.75052e+002;2.74908e+002;2.74847e+002;2.74761e+002;2.74689e+002;2.74497e+002
2.75420e+002;2.75327e+002;2.75281e+002;4.75178e+002;2.75052e+002;2.74908e+002;2.74847e+002;2.74761e+002;2.74689e+002;2.74497e+002

也就是说,每行10个值和3行,并注意我如何更改原始数据中的第四列值。

我的读取程序要求用户读取该列:

program readspeccol

integer :: readcol, i,j
double precision :: a(3)   ! 3 = number of lines in file
character(len=1) :: junk


print *,'input column:'
read(5,*) readcol

open(unit=15, file='testdata.dat')

do i = 1, 3
  read(15,'(10(es12.5,1a))') (a(i),junk, j=1,readcol)
  ! 10 = number of values in line
enddo


print *, a


end program readspeccol

如果我告诉它阅读第四列,则执行为:

$>  ./a.out
 input column:
4
   275.17800000000000        375.17800000000000        475.17800000000000  

可以对该程序进行进一步的调整,但是我认为这基本上是您所需要的。