我们如何在跳过其中的某些列时逐行读取特定文件?
例如,我有一个包含数据的文本文件,分为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)
任何解释或示例都会有所帮助。
答案 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
这会在每次迭代时覆盖b
,d
和e
中的值。
顺便提一下,你的行
99 continue
是多余的;它没有被用作do
循环的结束行,并且您不会从其他任何地方分支到它。如果您从看不见的代码分支到它,您可以将标签99
附加到下一行并删除continue
语句。通常,continue
在现代Fortran中是多余的;特别是在您的代码中似乎是多余的。