爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 8320|回复: 21

[求助] fortran读取数据换行的问题

[复制链接]

新浪微博达人勋

发表于 2016-1-5 00:09:29 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 wangxue910402 于 2016-1-5 21:03 编辑

1/fortran读取出来的数据默认的是五个一行,我想把第二行的数据弄成一行,请问能不能给个参考的例子?
2、为什么我的第二列的数据是这样的呢?原始数据明明是按照日期的顺序来的、读出来的全是偶数的,有点迷惑?
求指教。

我的数据一共76686行,第一行表头,按照站点好,日期,tmin,tmax,tavg,pr排放,经改正,按列输出后的程序:
Program main
Implicit none
!这里是程序的变量声明
Character*8 stid(1:76685) !原始数据除去表头有76685行
Real maxt(1:76685),mint(1:76685),avgt(1:76685),rain(1:76685) !定义数据有
integer years(1:76685)
integer year(1:76685),month(1:76685),day(1:76685)
integer i,j,k
real st
!变量声明结束

!程序开始
Open(1,file='e:\station.txt',status='old')
open(2,file='e:\station11.txt',status='unknown')  
read(1,*)
do i=1,76685
Read(1,*)stid(i),years(i),maxt(i),mint(i),avgt(i),rain(i)
write(2, '(A5,2x, I8,2x,F8.1,2x,F8.1,2x, <5>(F8.1,2x))')stid(i),years(i),maxt(i),mint(i),avgt(i),rain(i)print*,stid(i),years(i),maxt(i),mint(i),avgt(i),rain(i)
enddo
Close(1)

close(2)
end
这个程序能把数据按列数出来,但是,我的最终目的是想用if语句把每个站点的信息挑选出来,请问我这样按列排放应该怎么挑选呢?


QQ截图20160105001021.jpg

原始数据的格式

原始数据的格式

最终改正后按列输出的数据

最终改正后按列输出的数据
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-5 09:49:59 | 显示全部楼层
默认格式不行 你得看看原数据究竟是什么格式
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-5 10:45:22 | 显示全部楼层
核心是fortran的格式化输入输出
第一个问题,六个数据输出在一行的话,需要控制格式
第二个问题,看起来第二列应该是日期的说?因为你的数组a是实型,在默认格式输出的时候就变成数字形式了。按照我的习惯的话,会把台站号,日期和数据分成三个数组来读取的说
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-5 12:57:01 | 显示全部楼层
检查一下循环里面i,j的顺序问题
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-5 15:05:15 | 显示全部楼层
1、读取数据:你得按照数据排列格式来读,比如站号可以用A,日期设3个变量分别读取年月日
2、输出数据:格式化控制输出,比如这样 write(2, '(A5,2x, I4,2x,I2,2x,I2,2x, <5>(F8.1,2x))')  站号,年,月,日,数据
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-1-5 19:22:54 | 显示全部楼层
oishii 发表于 2016-1-5 15:05
1、读取数据:你得按照数据排列格式来读,比如站号可以用A,日期设3个变量分别读取年月日
2、输出数据:格 ...

我把我的原始数据格式传上去了,我想请教一下,我的日期是连在一起的,我直接这样设3个变量分别读取可行么?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-1-5 20:08:45 | 显示全部楼层
oishii 发表于 2016-1-5 15:05
1、读取数据:你得按照数据排列格式来读,比如站号可以用A,日期设3个变量分别读取年月日
2、输出数据:格 ...


你好,我还想再问一下,我的最终目的是想用if语句把每个站点的信息挑选出来,请问我这样按列排放应该怎么挑选呢?
我的方法是让if(stid=='56021') then,但是我不知道后面我应该怎么写,请指教,跪谢啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-1-5 20:39:08 | 显示全部楼层
oishii 发表于 2016-1-5 15:05
1、读取数据:你得按照数据排列格式来读,比如站号可以用A,日期设3个变量分别读取年月日
2、输出数据:格 ...

谢谢,把数据弄成一行了
56021  20090101   -9.20  -14.60     -12.0       0.0
53562  20090101   -4.00  -19.30     -13.0       0.0
谢谢你的例子,我就稍微改了一下,就行了,跪谢了。
但是我的原始数据中日期是连在一起的,我直接这样设3个变量分别读取可行么?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-6 07:56:16 | 显示全部楼层
wangxue910402 发表于 2016-1-5 20:08
你好,我还想再问一下,我的最终目的是想用if语句把每个站点的信息挑选出来,请问我这样按列排放应该怎 ...

设置一个动态数组  现把数据读入动态数组   然后if (sta='58238') then  对动态数组的某个站点的一行数据都可以读出了    一行数据读出后 这一行数据相当于一个一维数组  
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-6 08:00:06 | 显示全部楼层
wangxue910402 发表于 2016-1-5 19:22
我把我的原始数据格式传上去了,我想请教一下,我的日期是连在一起的,我直接这样设3个变量分别读取可行 ...

如果要分别读取日期的三个变量  个人觉得要先把整数格式转换为字符型 再对三个变量进行分别读取  这样设置比较麻烦,最好是看看数据内部每一行日期有没有规律,用循环来提取需要的日期就比较简单
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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