Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 如何从矩阵文本文件中读取特定列?不读整行?_Fortran_Fortran95 - Fatal编程技术网

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

Fortran 如何从矩阵文本文件中读取特定列?不读整行?,fortran,fortran95,Fortran,Fortran95,我有一个文本文件,包括数千行的结尾,每行有899个值/列,以“;”分隔(但如果需要,我可以更改分隔) 有没有一种方法可以在不将整行内容读入变量的情况下读取已定义的列(我想告诉代码是哪一列(每个读取icolumn)) 所以我知道:读(单位,*)a,b,c,d,e,。。。(899次不酷) 否则,我将把所有这些值放在一个数组中。在我可以用:array(I,icolumn)阅读我的专栏之后 我想要一个直接的方法。我的数据文件testdata.dat如下所示: 2.75420e+002;2.75327e+

我有一个文本文件,包括数千行的结尾,每行有899个值/列,以“;”分隔(但如果需要,我可以更改分隔)

有没有一种方法可以在不将整行内容读入变量的情况下读取已定义的列(我想告诉代码是哪一列(每个读取icolumn))

所以我知道:读(单位,*)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放入您可以使用的格式字符串中。

您知道要读取的值位于哪一列(如字符)?通常情况下,答案是将行读入字符串并解析,但在特殊情况下,您可能会幸运。您不必解析所有值并将它们存储到数组中。我不确定是否理解您的问题。我的线路看起来像: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;。。。。等等所以有固定数量的字符。是的,我想要一个特定的专栏,如165。所以我的程序应该问我想要哪个专栏。然后我写165。然后,他只将第165列读取到一个新文件虽然不是Fortran,但我想某些命令(如果可用)可能更方便…(如“cut-f 165-d\;matrix.dat”)实际上没有必要读取所有的垃圾文件。可怜的CPU必须免费完成从字符串到数字的大量转换。此外,当输入上的数字不包含小数点时,在esw.d中指定非零d可能会导致意外结果。好的,如果我更改了某些内容,这可能会起作用。有没有可能使用一个变量?我的意思是:我的程序问我哪个单元格,然后我在variableX中键入165,然后程序使用:read(unit),(t“variableX”,f12.0)数组(无论什么)@TomLucas你读了句子末尾的链接了吗?但是在我的代码中,
t
后面的数字不是csv单元格的数字。它是文本文件列!是的,我红了链接,但不太明白。(165只是一个例子。如果我想要第165个单元格,我将它乘以13(数字的数量),这没问题:)
read(unit),(t'//itoa(variableX)//',f12.0)数组(随便什么)
但是你可以在链接中使用这些方法中的任何其他方法。基本上这是啊,你的
itoa
将整数改为字符?好吧,我有点困惑,sry。。。