- 积分
- 6939
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2012-3-15
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 咕噜 于 2015-9-16 10:52 编辑
问题描述:
1,有400多个txt文件,一个文件是全球地面交换站每天4个时刻,所有台站所有观测量的一个月资料,从1980年到2014年,第一个文件有120M,最新的月份是900多M,就是很大很大,一共127G。我想取出自己选的几十个台站的风速,风向,气温几个要素
2,文件描述这样写的,缺测值一律用 空格 表示
序号 | 中文名 | 数据类型 | 位数 | 1. | 区站号 | Char(5) | 1-5 | 2. | 年 | Number(5) | 6-10 | 3. | 月 | Number(3) | 11-13 | 4. | 日 | Number(3) | 14-16 | 5. | 时 | Number(3) | 17-19 | 6. | 纬 度 | Number(6) | 20-25 | 7. | 经 度 | Number(7) | 26-32 |
………略
16. | 风 向 | Number(4) | 72-75 | 17. | 风 速 | Number(4) | 76-79 | 18. | 气 温 | Number(5) | 80-84 |
………略
119. | 特殊天气现象4质量控制码 | Number(2) | 385-386 | 120. | 特殊天气现象5质量控制码 | Number(2) | 387-388 | 121. | 特殊天气现象6质量控制码 | Number(2) | 389-390 |
3,截取一部分数据如下,01001是台站号,到一串8为止,包括所有空格有390个字符(我数过了),紧接着又是01001:
(这里开始)01001 1980 01 01 00 7093 -867 90 10166 -07 7 040 2 -090 -150 70000 02 2 90 9 450 38 00 8 8 8 0 0 0 0 0 0 1 8 0 0 8 0 0 0 0 0 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 0 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 801001 1980 01 01 06 7093 -867 90 10157 -06 8 360 1 -090 -150 70000 02 8 90 9 450 38 -1 8 8 8 0 0 0 0 0 0 1 8 0 0 8 0 0 0 0 0 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 0 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 801001 1980 01 01 12 7093 -867 90 10159 00 4 300 1 -110 -160 70000 03 1 75 5 450 38 24 10 8 8 8 0 0 0 0 0 0 1 8 0 0 8 0 0 0 0 0 0 0 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8(这里结尾)
每个空格都算一个字符,缺测值用空格表示,从一个时刻到下一时刻刚好390个字符,两个时刻之间没有间隔
4,已经尝试的方法:把数据当字符读,求出过一个文件的字符数,程序如下,算出来,1980年1月的字符数是132524730
iCount=0
open(3,file='J:\data\surf_wea_glb\SURF_WEA_GLB_MUL_FTM_QC-198001.txt')
do
read(3,'(a390)',ioStat=iErr)cStr
if(iErr/=0)Exit
icount=icount+Len_Trim(cStr)
enddo
close(3)
write(*,*) '共包含',iCount,'个字符'
由求得的字符数,尝试重新读出第一个字符,输入较小的数比如390可以读出字符来,但是输入132524730的时候就出错了,错误提示forrt:severe<24>:end-of-file during read, unit 3,file J:\data\surf_wea_glb……
我的程序是:
character*1,allocatable:: var(:)
open(3,file='J:\data\surf_wea_glb\SURF_WEA_GLB_MUL_FTM_QC-198001.txt')
read*,n
allocate(var(n))
read(3,*) (var(i),i=1,n)
print*, var(1)
close(3)
deallocate(var)
end
提出问题:
1,fortran对数据读取的数量有上限吗?390可以,132524730(亿位)就出错了——>或者是我求字符数的程序没写对,或者这个想法不现实?
2,如果能顺利读入写入数据,就可以用if语句判断前5个字符是否等于如54511(北京),然后把它后面的几十个字符取出来,间隔390循环,这个想法可行吗?麻烦大大们帮忙看看,非常感谢您!
|
|