我有一个包含行数的文本文件,每行有899个值/列,中间用';'分隔(但我可以根据需要更改分隔符)
有没有一种方法可以读取已定义的列(我想告诉代码(每个读取的列))而不将整行都读取为变量?
所以我知道的是:read(unit,*)a,b,c,d,e,...(899次并不酷) 否则,我会将所有这些值放在一个数组中。在我可以用以下内容阅读我的专栏:array(i,icolumn)
我想要直接的方法。
答案 0 :(得分:1)
如果您知道数字在字符165处,则只需使用t
或tr
或x
描述符移动到那里并读取数字
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
可以对该程序进行进一步的调整,但是我认为这基本上是您所需要的。