逐行读取文本文件,但只读取特定列

时间:2014-03-17 10:57:26

标签: file-io fortran

我们如何在跳过其中的某些列时逐行读取特定文件?

例如,我有一个包含数据的文本文件,分为5列,但我只需读取两列,它们可以是前两个或任何其他随机组合(我的意思是,需要一个解决方案)这将适用于任何列的组合,如第一和第三列。

像这样的代码

        open(1, file=data_file)
        read (1,*) ! to skip first line, with metadata
        lmax = 0
        do while (.true.)
                ! read column 1 and 3 here, either write
                ! that to an array or just loop through each row
        end do
99      continue        
        close (1)

任何解释或示例都会有所帮助。

2 个答案:

答案 0 :(得分:2)

High Performance Mark's answer提供了简单选择性列读取的基本要点:一个仍然读取列但将其转移到当时被忽略的变量。

要扩展该答案,请考虑我们要读取五列行的第二和第四列:

read(*,*) junk, x, junk, y

将第一个值转移到junk,然后将第二个值转移到x,然后将第三个值转换为junk,然后将第四个转换为y,最后将第四个转换为integer col1, col2 ! The columns we require, defined somehow (assume col1<col2) <type>, dimension(nrows) :: x, y, junk(3) ! For the number of rows integer i do i=1,nrows read(*,*) junk(:col1-1), x(i), junk(:col2-col1-1), y(i) end do {1}}。第五个被忽略,因为我们已经用完输入项并且传输语句终止(并且循环中的下一个读取将转到下一个记录)。

当然,当我们知道我们想要的那些列时,这很好。让我们概括一下我们事先不知道的事情:

do i=1,nrows
  read(*,*) allofthem(:5)
  x(i) = allofthem(col1)
  y(i) = allofthem(col2)
end do

在这里,我们将多个值(可能为零)传递到感兴趣的第一列之前,然后是感兴趣的值。之后,更多被忽略的值(可能为零),然后是感兴趣的最终值。该行的其余部分将被跳过。

这仍然非常基础,避免了许多潜在的要求并发症。在某种程度上,它可以考虑这样一种基本方法:

133

(其中该变量是逐行的临时变量),但多样性和选项都很好。

答案 1 :(得分:1)

这很容易。您只需从每一行读取5个变量,并忽略您没有进一步使用的变量。像

这样的东西
do i = 1, 100
    read(*,*) a(i), b, c(i), d, e
end do

这会在每次迭代时覆盖bde中的值。

顺便提一下,你的行

99 continue

是多余的;它没有被用作do循环的结束行,并且您不会从其他任何地方分支到它。如果您从看不见的代码分支到它,您可以将标签99附加到下一行并删除continue语句。通常,continue在现代Fortran中是多余的;特别是在您的代码中似乎是多余的。