如何从矩阵文本文件中读取特定列?不读整行?
How to read a specific column out of matrix-textfile? without reading whole line?
我有一个包含数千行的文本文件,每行有 899 values/columns 行,由“;”分隔(但如果需要我可以更改分隔)
有没有办法在不将整行读入变量的情况下读取定义的列(我想告诉代码哪个(每个读取的列))?
所以我知道:read(unit,*) a,b,c,d,e,...(899 次并不酷)
否则我会将所有这些值放在一个数组中。在我可以阅读我的专栏之后: array(i,icolumn)
我想要一个直接的方式。
我的数据文件 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
这个程序可以进一步调整,但我认为它基本上就是您要找的。
如果您知道数字在字符 165 处,那么您只需使用 t
或 tr
或 x
描述符移动到那里并读取数字
read(unit,'(t165,f12.0)' array(whatever)
如果您需要将数字 165 放入格式字符串中,您可以使用 this function.
我有一个包含数千行的文本文件,每行有 899 values/columns 行,由“;”分隔(但如果需要我可以更改分隔)
有没有办法在不将整行读入变量的情况下读取定义的列(我想告诉代码哪个(每个读取的列))?
所以我知道:read(unit,*) a,b,c,d,e,...(899 次并不酷) 否则我会将所有这些值放在一个数组中。在我可以阅读我的专栏之后: array(i,icolumn)
我想要一个直接的方式。
我的数据文件 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
这个程序可以进一步调整,但我认为它基本上就是您要找的。
如果您知道数字在字符 165 处,那么您只需使用 t
或 tr
或 x
描述符移动到那里并读取数字
read(unit,'(t165,f12.0)' array(whatever)
如果您需要将数字 165 放入格式字符串中,您可以使用 this function.