爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 9176|回复: 12

[其他] NCL怎样读取符合条件的某几行数据

[复制链接]

新浪微博达人勋

发表于 2017-10-11 17:36:33 | 显示全部楼层 |阅读模式

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

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

x
各位大神,我现在有一些包含全国站点的地面风场资料,是按月分的。
微信截图_20171012210242.png
格式为:
50136 5329 12221 102796 1968  8  1     18

我需要找出特定的一些站点数据,站点名放在了BB.TXT里。
现在为了找到所需站点的所有数据并将它们放在一个NC文件里,我做了以下处理

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"

begin

   fname = "/public/wa/1967--/sta/BB.txt"
   stan = asciiread(fname,-1,"float")
   
   d= dimsizes(stan)
   ;print(d)
   diri = "/public/wa/1967--/win/"
   files = systemfunc ("ls "+ diri + "SURF_CLI_CHN_MUL_DAY-WIN*.txt")
   f = addfiles(files,"r")
   ndim = dimsizes(files)
   nndim= ndim*31
  ; print(ndim)


id   = new((/nndim/),"float")
lat  = new((/nndim/),"float")
lon  = new((/nndim/),"float")
win  = new((/nndim/),"float")
yr   = new((/nndim/),"float")
mon  = new((/nndim/),"float")
day  = new((/nndim/),"float")

mm=0

do i =0,ndim-1
     
     t     = asciiread( files(i),-1,"string")
     nrows = dimsizes(t)
     iid  = new((/nrows/),"float")
  iid   = stringtofloat(str_get_field(t, 1,  "    "))
  dd    = dimsizes(iid)
  
do j=0,dd-1
     do k=0,d-1
   if(iid(j) .eq. stan(k)) then
   
    id(mm)    = stringtofloat(str_get_field(t, 1,  "    "))
    lat(mm)   = stringtofloat(str_get_field(t, 2,  "    "))*0.01
    lon(mm)   = stringtofloat(str_get_field(t, 3,  "    "))*0.01
    yr        = stringtofloat(str_get_field(t, 5,  "    "))
    mon       = stringtofloat(str_get_field(t, 6,  "    "))
    day       = stringtofloat(str_get_field(t, 7,  "    "))
    win(mm)   = stringtofloat(str_get_field(t, 8,  "    "))*0.1
   
  
    mm=mm+1
    print(mm)
   end if
  end do
end do

delete(t)
delete(iid)

end do



data2        = new((/mm,6/),"float")
data2!0      = "id"
data2!1      = "yr"
data2!2      = "mon"
data2!3      = "day"
data2&id     = id(0:mm-1)
data2&id@lat = lat(0:mm-1)
data2&id@lon = lon(0:mm-1)
data2        = (/win(0:mm-1)/)

printVarSummary(data2)
print(data2)

但是提示红色部分有错,fatal:Dimension sizes on right hand side of assignment do not match dimension sizes of left hand side
fatal:["Execute.c":8575]:Execute: Error occurred at or near line 43 in file select.ncl


请问这个是什么问题?另外我的这个循环可以得到我要的结果么?服务器运行太慢,我根本等不到输出,麻烦大家帮我看看了!感谢!

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

新浪微博达人勋

发表于 2017-10-11 17:55:52 | 显示全部楼层
stringtofloat(str_get_field(t, 1,  "    "))是把整个数组都读了的, id(mm) 只是一个数
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-10-12 11:35:53 | 显示全部楼层
挺身而出 发表于 2017-10-11 17:55
stringtofloat(str_get_field(t, 1,  "    "))是把整个数组都读了的, id(mm) 只是一个数

那请问我应该用哪一个函数才是读取那一行的第一个数啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-10-12 16:16:09 | 显示全部楼层
你直接a=stringtofloat(str_get_field(t, 1,  "    "))不就把整个数组都读了吗?然后a(mm)不就是具体某一行的了吗?
先读完数据,然后再判断赋值到另一个数组
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-10-13 07:36:45 | 显示全部楼层
挺身而出 发表于 2017-10-12 16:16
你直接a=stringtofloat(str_get_field(t, 1,  "    "))不就把整个数组都读了吗?然后a(mm)不就是具体某一行 ...

感谢。已经解决了。就是数据太大服务器无法运行NCL,正在尝试新办法
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-10-14 06:36:10 | 显示全部楼层
sususue 发表于 2017-10-13 07:36
感谢。已经解决了。就是数据太大服务器无法运行NCL,正在尝试新办法

是你的算法的问题吧,循环太多了吧
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-10-15 06:52:36 | 显示全部楼层
挺身而出 发表于 2017-10-14 06:36
是你的算法的问题吧,循环太多了吧

是的,请问您觉得我是不是应该换用其他软件呀
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-10-16 15:52:59 | 显示全部楼层
我最近做过类似的 用Fortran提取的 方便很多

find.f90

822 Bytes, 下载次数: 8, 下载积分: 金钱 -5

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

新浪微博达人勋

发表于 2017-10-18 09:57:44 | 显示全部楼层
用Fortran提取的 方便很多
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-10-18 10:11:48 | 显示全部楼层
songwei 发表于 2017-10-16 15:52
我最近做过类似的 用Fortran提取的 方便很多

非常感谢!请问        200 format(9I6)是什么意思呢?
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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