爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 11171|回复: 18

fortran数据读取问题

[复制链接]

新浪微博达人勋

发表于 2014-4-13 21:11:27 | 显示全部楼层 |阅读模式
GrADS
系统平台: fortran90
问题截图: -
问题概况: 用fortran读取数据,一共3列,第一列日期,第二列时间(一小时一个),第三列是要用到的数据,但是数据有些是缺测的,缺测的数据没有用任何数值表示,所以如果按照read(1,*) dat(i,j),tim(i,j),ppbv(i,j) 这个顺序读的话,ppbv缺测时就直接读到下一行去了(就是下一行的dat被赋值给了上一行的ppbv),请问这个问题怎么解决呢?
我看过提问的智慧: 看过
自己思考时长(天): 5

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
用fortran读取数据,一共3列,第一列日期,第二列时间(一小时一个),第三列是要用到的数据,但是数据有些是缺测的,缺测的数据没有用任何数值表示,所以如果按照read(1,*) dat(i,j),tim(i,j),ppbv(i,j) 这个顺序读的话,ppbv缺测时就直接读到下一行去了(就是下一行的dat被赋值给了上一行的ppbv),请问这个问题怎么解决呢?程序和数据的一部分如下所示:

program main
implicit none
integer m,n,i,j,t
parameter(m=24,n=28)
real dat(m,n),ppbv(m,n),ave(m),su(m)
character*8 tim(m,n)
open(1,file="f:\gjh\obs\o3.txt")
do j=1,n
do i=1,m
read(1,*) dat(i,j),tim(i,j),ppbv(i,j)
enddo
enddo
close(1)
print*,ppbv(1,1)
do i=1,m
do j=1,n
su(i)=su(i)+ppbv(i,j)
if(ppbv(i,j)/=0) then
t=t+1
endif
end do
ave(i)=su(i)/t
t=0
enddo
open(2,file="f:\gjh\ave.txt")
do i=1,m
write(2,*) dat(1,i),ave(i)
enddo
close(2)
end

数据的一部分:
090701 00:00,
090701 01:00,
090701 02:00,
090701 03:00,
090701 04:00,
090701 05:00,
090701 06:00,
090701 07:00,
090701 08:00,
090701 09:00, 73.81844
090701 10:00,
090701 11:00,
090701 12:00,
090701 13:00,
090701 14:00, 119.9938
090701 15:00, 146.0856
090701 16:00, 127.2168
090701 17:00, 131.7835
090701 18:00, 117.2331
090701 19:00, 126.4951
090701 20:00, 119.4215
090701 21:00, 77.94791
090701 22:00, 124.3685
090701 23:00, 109.4403
090702 00:00, 104.9256
090702 01:00, 100.0042
090702 02:00, 85.04134
090702 03:00, 71.45179
090702 04:00, 63.60510
090702 05:00, 23.91048
090702 06:00,
090702 07:00,
090702 08:00,
090702 09:00,
090702 10:00,
090702 11:00,
求大神,求回复
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-13 21:29:42 | 显示全部楼层
这样整齐的数据可以整行按照字符字符读取,然后对应字符段转换即可。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2014-4-14 08:46:10 | 显示全部楼层
就像楼上说的  这类数据一般都是每个数据固定几个字符长度的  按固定长度读取即可
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-4-14 13:58:11 | 显示全部楼层
lqouc 发表于 2014-4-13 21:29
这样整齐的数据可以整行按照字符字符读取,然后对应字符段转换即可。

但问题是:第三列没有值的时候连空格符也没有,直接就读到下一行了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-4-14 13:58:52 | 显示全部楼层
mofangbao 发表于 2014-4-14 08:46
就像楼上说的  这类数据一般都是每个数据固定几个字符长度的  按固定长度读取即可

但问题是:第三列没有值的时候连空格符也没有,直接就读到下一行了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-14 14:03:22 | 显示全部楼层
q863510557 发表于 2014-4-14 13:58
但问题是:第三列没有值的时候连空格符也没有,直接就读到下一行了

我和清风说的方法你试过了么?不明白怎么就会读到下一行?
这里面read如果用rec控制一下,是不可能读到下一行的,没有数据那就在运行的时候直接报错了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-4-14 14:20:44 | 显示全部楼层
lqouc 发表于 2014-4-14 14:03
我和清风说的方法你试过了么?不明白怎么就会读到下一行?
这里面read如果用rec控制一下,是不可能读到 ...

大神,你讲的东西太高端了,让我百度一下先
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-4-14 15:40:57 | 显示全部楼层
lqouc 发表于 2014-4-14 14:03
我和清风说的方法你试过了么?不明白怎么就会读到下一行?
这里面read如果用rec控制一下,是不可能读到 ...

我看到网上说的  不太懂意思  有一段是这样的
  
   Read( 12 , Rec = 4 ) cStr( 9 : 16 )

   Read( 12 , Rec = 3 ) cStr( 1 : 8 )

   Read( 12 , Rec = 1 ) iVar1 , iVar2

   Read( 12 , Rec = 2 ) rVar1 , rVar2

请问这个rec=1,2,3,4所指的是不是在同一行读取数据?rec等于一 就是第一个数据,等于四就是第四个数据。。。这样?   
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-14 16:20:19 | 显示全部楼层
q863510557 发表于 2014-4-14 15:40
我看到网上说的  不太懂意思  有一段是这样的
  
   Read( 12 , Rec = 4 ) cStr( 9 : 16 )

根据我的理解不是这样的,一个rec代表一个记录,在文本文件中一般就是一行。文本文件直接读取的参数设置详见彭国伦fortran教程255页。
不过其实我觉得完全不用这个rec,因为按照字符读取是不可能读到下一行的。microsoft下文本文件的末尾都有两个看不见的换行符,表示这一行结束,而一个read一次只能读取一条记录,所以应该是不会读到下一行的。
你可以设置一个肯定够长的字符串,然后format用缺省格式,读出来之后对应字符段进行转换应该就好了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-14 18:47:27 | 显示全部楼层
我觉得应该用一维的数组读
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表