爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 8092|回复: 9

【Fortran】Fortran读取以tab键分隔的数据文件时怎么读斜杠

[复制链接]

新浪微博达人勋

发表于 2017-12-18 17:09:40 | 显示全部楼层 |阅读模式
GrADS
系统平台: windows
问题截图:
问题概况: 在常规数据文件中,经常使用Tab分隔符,确保每行对齐,并用斜杠“/”代替缺测值(数据文件如图)
我在用Fortran读取时,用固定格式读取时由于每行数据占格不一样,不能统一用do语句循环,用无格式读取时,由于斜杠和tab符的存在,斜杠后的数据读取异常,请问这是怎么回事,有什么解决办法/
我看过提问的智慧: 看过
自己思考时长(天): 1

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

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

x
在常规数据文件中,经常使用Tab分隔符,确保每行对齐,并用斜杠“/”代替缺测值(数据文件如图)
我在用Fortran读取时,用固定格式读取时由于每行数据占格不一样,不能统一用do语句循环,用无格式读取时,由于斜杠和tab符的存在,斜杠后的数据读取异常,请问这是怎么回事,有什么解决办法?
program read_Afiles
    implicit none
    integer(8) yy,mm,dd,hh
character(8) station,lon,lat,height
    real(8) aa,bb,cc,rain
   
     open(12,file="D:\data\A_ELSE\I4101.txt")
     READ(12,*) station,lon,lat,height,yy,mm,dd,hh,AA,BB,CC,rain   !先仅读一行,无格式读取
    ! READ(12,100) station,lon,lat,height,yy,mm,dd,hh,rain               !先仅读一行,有格式读取
    ! 100 format(2(A5,1x),A6,1x,A4,1x,I4,1x,3(I2,1x),6x,i4)

     close(12)               
print *,station,lon,lat,height
    print *,yy,MM,DD,HH
    print *,AA
    print *,BB
    print *,CC
    print *,rain
   
end program read_Afiles

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-12-18 18:01:04 | 显示全部楼层
把/先全替换成999999之类的再读。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-12-18 18:05:25 | 显示全部楼层
如此整齐的数据已经是谢天谢地了
把整个记录作为一个长字符串,根据每个变量的位置截取字符串并转换为实型

ps:大家平时说的无格式似乎并不是这个意思
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-12-18 20:00:14 | 显示全部楼层
Fortran读取数据遇到“/”会自动停止,要么格式读取,要么将“/”替换成其他数字,再无格式读取
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-19 09:08:57 | 显示全部楼层
御风者 发表于 2017-12-18 18:01
把/先全替换成999999之类的再读。

上述数据只是某一个文件的前几行,还有几百个文件,手动修改有些崩溃吧
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-19 09:09:01 | 显示全部楼层
御风者 发表于 2017-12-18 18:01
把/先全替换成999999之类的再读。

上述数据只是某一个文件的前几行,还有几百个文件,手动修改有些崩溃吧
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-19 09:16:39 | 显示全部楼层
lqouc 发表于 2017-12-18 18:05
如此整齐的数据已经是谢天谢地了
把整个记录作为一个长字符串,根据每个变量的位置截取字符串并转换为实型 ...

    我之前就尝试过这种方法,由于tab符作为字符读的话算一个空格,由于上述数据只是诸多文件中的某一行,并不适用全部,比如高度的数据长度就不一样,按位置截取的话有的可行,有的就会读取下个数据的第一个字符了,这改怎么办呢?
     READ(12,"(A60)") ww
     station=ww(1:5)
     lon=ww(7:11)
     lat=ww(13:18)
     height=ww(20:25)      
!比如高度是52.0,读取出来是52.0 2(异常);高度是512.0,读取出来是512.0(正常)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-12-19 11:27:40 | 显示全部楼层
和清谈 发表于 2017-12-19 09:16
我之前就尝试过这种方法,由于tab符作为字符读的话算一个空格,由于上述数据只是诸多文件中的某一行 ...

高度有超过999.0的么?如果没有ww(20:25)改为ww(20:24)就好了。

如果有,那就需要用一个字符函数了,index函数你可以查一下用法,大概的方法就是从高度这个变量开始,很多气象要素的位数都是不确定,那么用index函数查找高度数值之后第一个空格的位置,例如高度为52.0那一行n=index(ww(20:60),' '),返回的n就应该是24,那么我们就知道高度的占位是20:23,那么下一个变量的占位就是从n+1(25)开始的。以此类推,可以找到所有的变量在这个记录中的位置。

具体的代码请自行摸索啦。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-21 08:31:01 | 显示全部楼层
lqouc 发表于 2017-12-19 11:27
高度有超过999.0的么?如果没有ww(20:25)改为ww(20:24)就好了。

如果有,那就需要用一个字符函数了,i ...

用index查找高度数值之后第一个空格,有些难度。
我后来用了一个笨办法:先用“*”替代“/”创建一个新数据文件,再读取
        open(12,file=path)
        open(13,file=path_new)                         ! 创建新数据文件(以*代替/)
        do while(.true.)
            READ(12,"(A80)",end=900) bb
            do while(index(bb,"/")>0)
                bb(index(bb,"/"):index(bb,"/"))="*"
            enddo
            write(13,*) bb
        enddo
        900 close(12)
        close(12)
        close(13)

PS:本来想在数据文件中用999.9直接替换掉“/”,但这就要考虑字符型变量的实际长度,添加长度不一样,所以就放弃了这个办法。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-21 08:31:05 | 显示全部楼层
lqouc 发表于 2017-12-19 11:27
高度有超过999.0的么?如果没有ww(20:25)改为ww(20:24)就好了。

如果有,那就需要用一个字符函数了,i ...

用index查找高度数值之后第一个空格,有些难度。
我后来用了一个笨办法:先用“*”替代“/”创建一个新数据文件,再读取
        open(12,file=path)
        open(13,file=path_new)                         ! 创建新数据文件(以*代替/)
        do while(.true.)
            READ(12,"(A80)",end=900) bb
            do while(index(bb,"/")>0)
                bb(index(bb,"/"):index(bb,"/"))="*"
            enddo
            write(13,*) bb
        enddo
        900 close(12)
        close(12)
        close(13)

PS:本来想在数据文件中用999.9直接替换掉“/”,但这就要考虑字符型变量的实际长度,添加长度不一样,所以就放弃了这个办法。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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