爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 12228|回复: 34

[求助] 怎样对一个有四五万条记录的txt文件进行统计运算???困扰很久了。求助呀%>_<%

[复制链接]

新浪微博达人勋

发表于 2013-4-20 11:12:47 | 显示全部楼层 |阅读模式

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

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

x



《四川地面气候日值数据集》1951-2011年四川省各测站各气象要素的逐日观测数据,现在想求56492(宜宾)站1951-2011年逐年11月上旬日平均气温的旬平均值。
每个txt文件里有四五万行,不知道怎样求旬平均值。
还是将每个txt文件里的数据存到一个数组里再对数组进行运算吗?那这个数组会不会太大了???
这个问题困扰我好久了。。。不解决论文就没法动笔。。下周就要中期检查了。。。。求助各位大神。。。。
QQ截图20130420110432.png QQ截图20130420110337.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-20 11:20:09 | 显示全部楼层
同志,才四五万行不要说得那么悲壮吧,循环读取加两层判断就好了,数组怎么会太大?我算全球的六小时间隔站点也没溢出啊,楼主先自己动手吧。不会有人直接编好给你的。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-20 12:05:16 | 显示全部楼层
本帖最后由 冰点 于 2013-4-25 03:41 编辑

我刚好做了类似的工作,第一步我计算了每个站每个月的月平均温度
我的数据是60年的全国756站的降水,最大、最小及平均日温度数据,程序中我只用到了温度,程序运行后可以得到60年的每个站的月平均温度数据。 years.jpg temp.jpg 1960.jpg years.txt中存放的是60年的文件名,作批处理用,temp文件夹中放有60个文件,最后一张图是我随意打开的一年的数据,数据格式如图,也有缺测值,平均下来每年的数据也是几万行,这儿没用数组,希望你能看明白。现把程序贴上来: monthly.f90 (1.09 KB, 下载次数: 30)

评分

参与人数 1金钱 +10 贡献 +2 收起 理由
mofangbao + 10 + 2

查看全部评分

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

新浪微博达人勋

发表于 2013-4-20 12:06:57 | 显示全部楼层
另外,我看你的数据文件名也都是连续的,作批处理的时候也很方便……
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-20 12:53:39 | 显示全部楼层
4w+不算大,对fortran来说 小case
再说你都有时间了,判断一下 循环一个  都出来了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-20 15:23:38 | 显示全部楼层
你要相信fortran的数组能力,楼上说的都对~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-20 15:38:28 | 显示全部楼层
补充一点,楼上的说的都对
从楼主说的那个数组会不会太大来看,楼主自己还没有具体思路,而且也不理解fortran的一些东西,所以还是自己先努力一下吧
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-4-20 16:20:35 | 显示全部楼层

我的想法就是把文件里的数据读取到数组中,再对数组进行运算。下面是我的程序。编译没有错误。但是运行不出来,能不能帮我看看。。

program main

character filei,fileii
integer stn(100000),year(100000),mon(100000),day(100000),temp(100000),n
real sum

filei='SURF_CLI_CHN_MUL_DAY_1348578049292_01.txt'
fileii='xpj'

sum=0

do i=1,100000
stn(k)=0
year(k)=0
mon(k)=0
day(k)=0
temp(k)=0
enddo

print*,stn

do j=1951,2011
!write(fileii(1:4),'(i4)') j
open(2,file=fileii)

do i=1,10
write(filei(36:37),'(i2)') i
open(1,file=filei)

do k=1,100000
read(1,100) stn(k),year(k),mon(k),day(k),temp(k)
100 format(I5,I7,I5,I7,I12)
close(1)
enddo

do k=1,100000
if(stn(k).eq.56492.and.mon(k).eq.11.and.day(k)<=10.and.temp(k).ne.32766.and.year(k).ne.j)then
sum=sum+temp(k)
n=n+1
endif
sum=sum/(n*10)
write(2,*)         j,sum
enddo
enddo

close(2)
enddo

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

新浪微博达人勋

 楼主| 发表于 2013-4-20 16:21:16 | 显示全部楼层
topmad 发表于 2013-4-20 12:53
4w+不算大,对fortran来说 小case
再说你都有时间了,判断一下 循环一个  都出来了

我的想法就是把文件里的数据读取到数组中,再对数组进行运算。下面是我的程序。编译没有错误。但是运行不出来,能不能帮我看看。。

program main

character filei,fileii
integer stn(100000),year(100000),mon(100000),day(100000),temp(100000),n
real sum

filei='SURF_CLI_CHN_MUL_DAY_1348578049292_01.txt'
fileii='xpj'

sum=0

do i=1,100000
stn(k)=0
year(k)=0
mon(k)=0
day(k)=0
temp(k)=0
enddo

print*,stn

do j=1951,2011
!write(fileii(1:4),'(i4)') j
open(2,file=fileii)

do i=1,10
write(filei(36:37),'(i2)') i
open(1,file=filei)

do k=1,100000
read(1,100) stn(k),year(k),mon(k),day(k),temp(k)
100 format(I5,I7,I5,I7,I12)
close(1)
enddo

do k=1,100000
if(stn(k).eq.56492.and.mon(k).eq.11.and.day(k)<=10.and.temp(k).ne.32766.and.year(k).ne.j)then
sum=sum+temp(k)
n=n+1
endif
sum=sum/(n*10)
write(2,*)         j,sum
enddo
enddo

close(2)
enddo

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

新浪微博达人勋

 楼主| 发表于 2013-4-20 16:21:29 | 显示全部楼层
lqouc 发表于 2013-4-20 11:20
同志,才四五万行不要说得那么悲壮吧,循环读取加两层判断就好了,数组怎么会太大?我算全球的六小时间隔站 ...

我的想法就是把文件里的数据读取到数组中,再对数组进行运算。下面是我的程序。编译没有错误。但是运行不出来,能不能帮我看看。。

program main

character filei,fileii
integer stn(100000),year(100000),mon(100000),day(100000),temp(100000),n
real sum

filei='SURF_CLI_CHN_MUL_DAY_1348578049292_01.txt'
fileii='xpj'

sum=0

do i=1,100000
stn(k)=0
year(k)=0
mon(k)=0
day(k)=0
temp(k)=0
enddo

print*,stn

do j=1951,2011
!write(fileii(1:4),'(i4)') j
open(2,file=fileii)

do i=1,10
write(filei(36:37),'(i2)') i
open(1,file=filei)

do k=1,100000
read(1,100) stn(k),year(k),mon(k),day(k),temp(k)
100 format(I5,I7,I5,I7,I12)
close(1)
enddo

do k=1,100000
if(stn(k).eq.56492.and.mon(k).eq.11.and.day(k)<=10.and.temp(k).ne.32766.and.year(k).ne.j)then
sum=sum+temp(k)
n=n+1
endif
sum=sum/(n*10)
write(2,*)         j,sum
enddo
enddo

close(2)
enddo

end
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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