如何在fortran中逐行读取具有不规则记录数的行

时间:2014-10-24 06:10:34

标签: file csv fortran

我有test.csv(300行)文件,如下所示

10 20 100 2 5 4 5 7 9 10 ....
55 600 7000 500 25 
3 10
2 5 6
....

每一行有不同的整数(最大记录数= 1000),我需要逐行处理这些记录。我试过如下

integer,dimension(1000)::rec
integer::i,j
open(unit=5,file="test.csv",status="old",action="read")
do i=1,300
read(unit=5,fmt=*) (rec(j),j=1,1000)
!do some procedue with rec
enddo
close(unit=50)

但似乎rec数组不是逐行构造的。这意味着当i = n时,rec从非第n行获得数字。我该如何解决这个问题。

谢谢

1 个答案:

答案 0 :(得分:1)

列出定向格式(由read语句中的星号指定)读取满足列表所需的内容(因此它是" list directed")。如图所示,您的代码将尝试每次迭代读取1000个值,每次迭代消耗尽可能多的记录(行)以便执行此操作。

(列出定向格式有许多令人惊讶的功能,40年前基于卡的输入形式可能有意义,但今天可能错位。在使用列表导向输入之前,你应该准确理解它周围的规则是什么说。)

这种情况的现实和稳健的方法是逐行读入输入,然后"手动"处理每一行,标记该行并根据您遵循的规则提取值。

(你应该联系那些名字完全没有逗号或分号的文件和扩展名" .csv",然后聊聊天。)

(作为一般规则,应避免使用低值单位数。由于历史原因,它们可能已被预先连接用于其他目的。将它们重新连接到不同的文件可保证用于此特定目的,但其他声明您的程序可能隐含地假设低值单元仍然在程序开始执行之前连接 - 例如,打算与控制台一起使用的PRINT和READ语句可能会开始对您的文件进行操作。)