爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4424|回复: 13

[求助] fortran提取站点名

[复制链接]
发表于 2016-4-26 11:47:11 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 自由行 于 2016-4-26 15:33 编辑

现在想通过fortran提取第一列的站点名,但时txt格式如下,第一列是站号,第二列是年份,现在想知道怎么提取第一列数据的站点名,不知道怎么提取,能知道一个txt里面有多少个站点,比较急,谢谢各位大神了。
QQ图片20160426114437.png

1.txt

389.24 KB, 下载次数: 5, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao
发表于 2016-4-26 12:06:24 | 显示全部楼层
本帖最后由 Masterpiece 于 2016-4-26 12:20 编辑

我只能说一个大致的算法,怎么open怎么read(1,10) sta_id(i)怎么判断文件末尾自动结束循环的,自己看fortran书吧...
算法基本思想就是逐行读取站号,当读到下一个站时,站号前一个站肯定不相等,这时让计数变量+1

变量声明
integer sta_id(0:1000) ,temp,count
!sta_id的数组大小只要比你收录的站数多就行,不行就2000,再不行10000
!temp是来暂时存储站号的
!count为计数用
从上至下,依次读取各个行的站号
do i=1,10000 !这里的10000看你的文件行数有多少了
   read(1,*) temp
   if(temp/=sta_id(count)) then
      count=count+1
      sta_id(count)=temp
   else
   end if
end do

count在循环结束之后的数值就是数据文件中的收录的站点数

这个时候如果在程序中加入以下代码
do i=1,count
   print *,sta_id(i)
end do
就可以输出数据文件中所有站点的站号




密码修改失败请联系微信:mofangbao
 楼主| 发表于 2016-4-26 14:06:48 | 显示全部楼层
Masterpiece 发表于 2016-4-26 12:06
我只能说一个大致的算法,怎么open怎么read(1,10) sta_id(i)怎么判断文件末尾自动结束循环的,自己看fortra ...

太感谢您的解答了,我自己再好好的看看在研究下吗,如有疑问希望与您多交流
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2016-4-26 14:52:41 | 显示全部楼层
Masterpiece 发表于 2016-4-26 12:06
我只能说一个大致的算法,怎么open怎么read(1,10) sta_id(i)怎么判断文件末尾自动结束循环的,自己看fortra ...

!逐行读取站号,当读到下一个站时,站号前一个站肯定不相等,这时让计数变量+1

!变量声明
integer sta_id(0:1000) ,temp,count !sta_id的数组大小只要比你收录的站数多就行,不行就2000,再不行10000
!temp是来暂时存储站号的
!count为计数用
!从上至下,依次读取各个行的站号
integer,parameter::n=56940

open(30,file="F:\work\gongbao\2015\1\1.txt")
do i=1,n
read(30,*)temp
print*,temp
end do

open(50,file="F:\work\gongbao\2015\1\out1.txt")
do i=1,n !这里的10000看你的文件行数有多少了
         !read(1,*) temp
   if(temp/=sta_id(count)) then
      count=count+1
      sta_id(count)=temp
   else
   end if
end do
write(50,*) count
close(50)
end

有个问题就是现在输出的count=1.不知道是错在了哪里。

密码修改失败请联系微信:mofangbao
发表于 2016-4-26 15:07:29 | 显示全部楼层
本帖最后由 Masterpiece 于 2016-4-26 15:09 编辑
自由行 发表于 2016-4-26 14:52
!逐行读取站号,当读到下一个站时,站号前一个站肯定不相等,这时让计数变量+1

!变量声明

嗯,问题应该出在第一个循环
这么改你试试
program main
integer sta_id(0:1000) ,temp,count
integer,parameter::n=56940
sta_id=0
count=0
open(30,file="F:\work\gongbao\2015\1\1.txt")
open(50,file="F:\work\gongbao\2015\1\out1.txt")
do i=1,n
   read(30,*) temp
    if(temp/=sta_id(count)) then
       count=count+1
       sta_id(count)=temp
       write(50,*) sta_id(count)
    else
    end if
end do
print *,'总站数:',count
close(30)
close(50)
end

密码修改失败请联系微信:mofangbao
 楼主| 发表于 2016-4-26 15:35:09 | 显示全部楼层
Masterpiece 发表于 2016-4-26 15:07
嗯,问题应该出在第一个循环
这么改你试试
program main

!逐行读取站号,当读到下一个站时,站号前一个站肯定不相等,这时让计数变量+1

!变量声明
integer sta_id(0:1000) ,temp,count !sta_id的数组大小只要比你收录的站数多就行,不行就2000,再不行10000
!temp是来暂时存储站号的
!count为计数用
!从上至下,依次读取各个行的站号
integer,parameter::n=56940
sta_id=0
count=0


open(30,file="F:\work\gongbao\2015\1\1.txt")
do i=1,n
read(30,*)temp
!print*,temp
end do
close(30)

open(50,file="F:\work\gongbao\2015\1\out1.txt")
do i=1,n !这里的10000看你的文件行数有多少了
         !read(1,*) temp
   if(temp/=sta_id(count)) then
      count=count+1
      sta_id(count)=temp   
  write(50,*)sta_id(count)
   else
   end if
end do
print*,'zongzhanzhu:',count
close(50)
end
试了一下,还是count只有一个站。而且是最后一个站,不知道您方便不,原始txt已经上传到网上,不知道下载需要金钱不,或者您有联系邮箱方便传你吗,真是太麻烦了。
密码修改失败请联系微信:mofangbao
发表于 2016-4-26 16:41:07 | 显示全部楼层
本帖最后由 Masterpiece 于 2016-4-26 16:42 编辑
自由行 发表于 2016-4-26 15:35
!逐行读取站号,当读到下一个站时,站号前一个站肯定不相等,这时让计数变量+1

!变量声明

你直接用我在5楼给的那个程序,我把你给的数据文件放了进去,可以用的
QQ截图20160426164124.png
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2016-4-26 16:47:21 | 显示全部楼层
Masterpiece 发表于 2016-4-26 16:41
你直接用我在5楼给的那个程序,我把你给的数据文件放了进去,可以用的

嗯嗯好的,真的是太感谢您了,那我就不太明白自己的程序出错在哪里了。
密码修改失败请联系微信:mofangbao
发表于 2016-4-26 17:04:22 | 显示全部楼层
自由行 发表于 2016-4-26 16:47
嗯嗯好的,真的是太感谢您了,那我就不太明白自己的程序出错在哪里了。

出错在第一个循环
第一个循环结束的时候,temp的值是最后一个站点的站号

当进入第二个循环的时候,if语句中的判断只进行了一次
第一次循环时,temp并不等于sta_id(0)
于是进入then后部分,count从0加到1,并且将temp的值赋给了sta_id(1)
但是这时temp并没有变化
这时无论进行多少次循环,用于if语句条件中的temp由于没有变化
【temp/=sta_id(count) 】这一条件会一直【不成立】,因为count=1,temp==sta_id(count)

所以你要让temp随着循序变化,正确的做法就是像5楼给的程序那样,将两个do循环变作一个
在循环体中依次进行:读取某一行的站号存放至temp,与前一个站的站号比较,若相等则继续下一行的读取,若不相等则count自加1,并将站号存入数组sta_id中

评分

参与人数 1金钱 +10 收起 理由
lqouc + 10

查看全部评分

密码修改失败请联系微信:mofangbao
 楼主| 发表于 2016-4-26 17:14:44 | 显示全部楼层
自由行 发表于 2016-4-26 16:47
嗯嗯好的,真的是太感谢您了,那我就不太明白自己的程序出错在哪里了。

谢谢大神,我也不太明白自己原来的程序错在哪了,只是读入的时候单独读入了,望大神多多指教
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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