daydaycode 发表于 2020-3-24 15:52:43

fortran读取有缺失的数据问题

本帖最后由 daydaycode 于 2020-3-24 17:22 编辑



fortran小白请教下fortran处理txt文件问题。需要处理的数据为地面自动站气象数据,数据包含的数据类型主要有字符串和浮点及整数等类型格式,数据为62247*212的矩阵,但是在57418行到最后的前6列都没有值,这样在数据读取的时候就会提示读取文件末尾报错,请问想正确读入这类型的数据,该怎么编写fortran代码。自己参考别人的代码,写的fortran程序,不能处理以上的问题,代码及数据和报错信息如下,还请各位前辈指教下怎么修改
PROGRAM predeal_dimianzidong
IMPLICIT NONE

INTEGER                              ::i,j                !读取数据的行数
INTEGER, PARAMETER      ::row=62247,col=212
CHARACTER,DIMENSION(row,col)   ::data_read,data_1

OPEN(UNIT=3, FILE='SURF_CHN_MUL_HOR_2019080100.txt', STATUS='OLD',ACTION='READ',FORM='FORMATTED',ACCESS='sequential')      !打开文件
!READ(3,*) ((data_read(i,j),j=1,col),i=1,row)
DO i = 1,row
READ(3,*)(data_read(i,j),j=1,col)
END DO
!data_1 = transpose(data_read)
print*,SHAPE(data_read)
!PRINT*,data_1
CLOSE(UNIT=3)      !关闭文件
STOP
END PROGRAM predeal_dimianzidong

li913 发表于 2020-3-24 16:07:46

本帖最后由 kyra 于 2020-3-24 17:19 编辑

把你的数据上传,只需要57418行前后几行的数据就行。

DO i = 1,row
if(i<57418) then
READ(3,*) data_read(i,:)
else
READ(3,*) data_read(i,7:)
end if
END DO

daydaycode 发表于 2020-3-24 16:19:00

li913 发表于 2020-3-24 16:07
把你的数据上传,只需要57418行前后几行的数据就行。

DO i = 1,row


您好,数据已上传,麻烦给看一下

daydaycode 发表于 2020-3-24 16:38:42

li913 发表于 2020-3-24 16:07
把你的数据上传,只需要57418行前后几行的数据就行。

DO i = 1,row


按照您的代码修改,还是不行,我用论坛读取非固定格式每行的数据数那个程序,发现我的数据第一行只有184个数据,还有的行没有211个数据,只有210个,像这种情况该怎么处理呢。

vvt 发表于 2020-3-24 17:15:00

你首先需要找到一个规则。再什么情况下,你认为第一列是缺失的,什么情况下你认为是第二列缺失的?

比如:
姓名   年龄体重
张三   30    55.3
李四      40你如何判断第二行的40,是年龄还是体重?

daydaycode 发表于 2020-3-24 17:21:55

vvt 发表于 2020-3-24 17:15
你首先需要找到一个规则。再什么情况下,你认为第一列是缺失的,什么情况下你认为是第二列缺失的?

比如: ...

这个要怎么来定呢,我也不能确定它是哪一列会有缺失,我上传了有缺失的地方截图,你可以看下。

vvt 发表于 2020-3-24 17:24:02

我既然回复你的帖子,肯定都认真看过你提供的所有内容了。

我没有办法判断,因为你不管说 40 是年龄,还是体重,都是不违背任何规则的。

你是问题的提出者,应该你来确定问题的规则。然后根据问题的规则来书写合适的代码。

vvt 发表于 2020-3-24 17:25:57

你可以看看你的数据是如何得来的,是否可以转存为其他数据格式?比如 csv,用逗号间隔开。

比如
姓名, 年龄 , 体重
张三, 30 ,   55.3
李四 ,, 40

因为第3行有两个逗号,我可以认定,40应该是体重,而年龄缺失。

li913 发表于 2020-3-25 10:56:04

看起来你的文件中数据是以tab分隔的,你可以用excel打开数据,检查一下是否有误,然后另存为csv格式。读取csv格式就方便了。program test
implicit none
integer i
INTEGER, PARAMETER      ::row=11,col=212
character(40) dat(col-6, row)
dat = 'undefined'
open(10,file='1.csv')
read(10,*)
do i = 1, row
    read(10,*) dat(:,i)
end do
close(10)
end program

daydaycode 发表于 2020-3-25 13:47:33

li913 发表于 2020-3-25 10:56
看起来你的文件中数据是以tab分隔的,你可以用excel打开数据,检查一下是否有误,然后另存为csv格式。读取c ...

十分感谢,现在问题解决了。请问,像这种情况只能把txt转成csv吗,还有别的方法吗?
页: [1] 2
查看完整版本: fortran读取有缺失的数据问题