GrADS描述文件(CTL)解析器 (2)

本文介绍了GRADS软件中用于数据集控制的类gradsCtl的实现细节,包括其属性如数据集名称、维度定义等,并阐述了gradsDim类如何处理时间、空间维度的数据解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


gradsCtl.java
01 /**
02  * PACKAGE      : cma.common.grads
03  * DESCRIPTION  :
04  * AUTHOR       : 刘泽军
05  * EMAIL        : BJ0773@gmail.com
06  * Date         : 2004-12-01
07  * Time         : 22:39:59
08  * Relation     : gradsDim.java, gradsCtl.java, gradsVar.java, grads.java
09  * Compile      : javac -d . gradsDim.java gradsCtl.java gradsVar.java grads.java
10  */
11 
12 package cma.common.grads;
13 
14 import java.util.Vector;
15 
16 public class gradsCtl {
17     public  String  dset;
18     public  String  index;      //暂未支持
19     public  String  dtype;      //暂未支持
20     public  String  options;
21     public  String  title;
22     public  String  undef;
23 
24     public  String      pdef;   //暂未支持
25 
26     public  gradsDim    xdef;
27     public  gradsDim    ydef;
28     public  gradsDim    zdef;
29     public  gradsDim    tdef;
30 
31     public  Vector  vars;//Object of class gradsVar
32     public gradsCtl() {
33         xdef    = new gradsDim();
34         ydef    = new gradsDim();
35         zdef    = new gradsDim();
36         tdef    = new gradsDim();
37         vars    = new Vector();
38     }
39 }

 


gradsVar.java
01 /**
02  * PACKAGE      : cma.common.grads
03  * DESCRIPTION  :
04  * AUTHOR       : 刘泽军
05  * EMAIL        : BJ0773@gmail.com
06  * Date         : 2004-12-01
07  * Time         : 22:40:26
08  * Relation     : gradsDim.java, gradsCtl.java, gradsVar.java, grads.java
09  * Compile      : javac -d . gradsDim.java gradsCtl.java gradsVar.java grads.java
10  */
11 
12 package cma.common.grads;
13 
14 public class gradsVar {
15     public  String  name        = "";
16     public  int     levels      = 0;
17     public  String  reserve     = "";
18     public  String  contents    = "";
19     public  String  unicode     = "";
20     public gradsVar() {
21     }
22     public  String  convertToString() {
23         returnname + " " + String.valueOf(levels" " + reserve + " " + contents);
24     }
25 }

 


gradsDim.java
001 /**
002  * PACKAGE      : cma.common.grads
003  * DESCRIPTION  :
004  * AUTHOR       : 刘泽军
005  * EMAIL        : BJ0773@gmail.com
006  * Date         : 2004-12-01
007  * Time         : 22:40:19
008  * Relation     : gradsDim.java, gradsCtl.java, gradsVar.java, grads.java
009  * Compile      : javac -d . gradsDim.java gradsCtl.java gradsVar.java grads.java
010  */
011 
012 package cma.common.grads;
013 
014 public class gradsDim {
015     public  String  symbol  = "";
016     public  int     count   = 0;
017     public  String  type    = "";
018     public  String  start   = "";
019     public  String  increment   = "";
020     public  String  value[]     {""};
021     public gradsDim() {
022     }
023     public boolean extractValue(String str[]) {
024         ifstr.length < ) {
025             return(false);
026         }
027         symbol  = str[0];
028         count   = Integer.parseInt(str[1]);
029         value   = new String[count];
030         for(int i=0;i<count;i++) {
031             value[i]    "";
032         }
033         type    = str[2];
034         try {
035             if== symbol.compareToIgnoreCase("tdef") ) {
036                 start       = str[3];
037                 increment   = str[4];
038                 int year=-1, month=-1, day=1, hour=0, min=0;
039                 String  monStr[] {"Jan""Feb""Mar""Apr""May""Jun""Jul""Aug""Sep""Oct""Nov""Dec"};
040                 String  mon = "";
041                 String  tmp = str[3].substring(0,str[3].length()-7).toUpperCase();
042                 year        = Integer.parseInt(str[3].substring(str[3].length()-4));
043                 mon         = str[3].substring(str[3].length()-7,str[3].length()-4);
044                 for(int m=1;m<=12;m++) {
045                     if== monStr[m-1].compareToIgnoreCase(mon) ) {
046                         month   = m;
047                         start   = str[3].replaceAll(mon, monStr[m-1]);
048                     }
049                 }
050                 if> year || 9999 <= year || > month || 12 < month ) {
051                     return(false);
052                 }
053                 try {
054                     if-!= tmp.indexOf("Z") ) {
055                         day = Integer.parseInt(tmp.substring(tmp.indexOf("Z")+1));
056                         tmp = tmp.substring(0, tmp.indexOf("Z"));
057                     }
058                     if-!= tmp.indexOf(":") ) {
059                         hour    = Integer.parseInt(tmp.substring(0,tmp.indexOf(":")));
060                         min     = Integer.parseInt(tmp.substring(tmp.indexOf(":")+1));
061                     }
062                     else {
063                         hour    = Integer.parseInt(tmp);
064                     }
065                 }
066                 catch(Exception e) {
067                 }
068                 value[0]    =
069                     String.valueOf(year +10000).substring(1+
070                     String.valueOf(month+100  ).substring(1+
071                     String.valueOf(day  +100  ).substring(1+
072                     String.valueOf(hour +100  ).substring(1);
073                 int intIncrement    = 0;
074                 String  suffix = "";
075                 ifstr[4].toLowerCase().endsWith("mn") ) {
076                     intIncrement   = Integer.parseInt(str[4].substring(0,str[4].toLowerCase().indexOf("mn")));
077                     ifintIncrement >= 60) {
078                         intIncrement    = intIncrement / 60;
079                         suffix  = "hr";
080                     }
081                     else {
082                         suffix  = "mn";
083                     }
084                 }
085                 else ifstr[4].toLowerCase().endsWith("hr") ) {
086                     intIncrement   = Integer.parseInt(str[4].substring(0,str[4].toLowerCase().indexOf("hr")));
087                     ifintIncrement >= 24) {
088                         intIncrement    = intIncrement / 24;
089                         suffix  = "dy";
090                     }
091                     else {
092                         suffix  = "hr";
093                     }
094                 }
095                 else ifstr[4].toLowerCase().endsWith("dy") ) {
096                     intIncrement   = Integer.parseInt(str[4].substring(0,str[4].toLowerCase().indexOf("dy")));
097                     suffix  = "dy";
098                 }
099                 else ifstr[4].toLowerCase().endsWith("mo") ) {
100                     intIncrement   = Integer.parseInt(str[4].substring(0,str[4].toLowerCase().indexOf("mo")));
101                     suffix  = "mo";
102                 }
103                 else ifstr[4].toLowerCase().endsWith("yr") ) {
104                     intIncrement   = Integer.parseInt(str[4].substring(0,str[4].toLowerCase().indexOf("yr")));
105                     suffix  = "yr";
106                 }
107                 else {
108                     try {
109                         intIncrement   = Integer.parseInt(str[4]);
110                         suffix  = "";
111                     }
112                     catch(Exception e) {
113                     }
114                 }
115                 increment   = String.valueOf(intIncrement+ suffix;
116                 for(int j=0;j<count;j++) {
117                     value[j]    = String.valueOf(1000000+j*intIncrement).substring(1);
118                     whilevalue[j].length() && value[j].startsWith("0") ) {
119                         value[j]    = value[j].substring(1);
120                     }
121                     value[j]    = value[j+ suffix;
122                 }
123                 if== count ) {
124                     value[0]    "anl";
125                 }
126             }
127             else {//xdef ydef zdef
128                 start   = str[3];
129                 if== type.compareToIgnoreCase("LINEAR") ) {
130                     increment   = String.valueOf(Float.parseFloat(str[4]));
131                     for(int j=0;j<count;j++) {
132                         value[j]    = start + Float.parseFloat(increment* j;
133                     }
134                 }
135                 else if== type.compareToIgnoreCase("LEVELS") ) {
136                     ifstr.length - != count ) {
137                         return(false);
138                     }
139                     for(int j=0;j<count;j++) {
140                         value[j]    = String.valueOf(Float.parseFloat(str[3+j]));
141                     }
142                 }
143                 else {
144                     return(false);
145                 }
146                 ifsymbol.equalsIgnoreCase("zdef") ) {
147                     //System.out.println(symbol + " ====================== " + String.valueOf(count));
148                     for(int i=0;i<count;i++) {
149                         //System.out.println("LEVEL = " + value[i]);
150                         if-!= value[i].indexOf("."&& !value[i].endsWith("."&&
151                             == Integer.parseInt(value[i].substring(value[i].indexOf(".")+1)) ) {
152                             value[i]    = value[i].substring(0,value[i].indexOf("."));
153                             //System.out.println(" ====>>>>  " + value[i]);
154                         }
155                     }
156                 }
157             }
158             return(true);
159         }
160         catch(Exception e) {
161             return(false);
162         }
163     }
164     public String convertToString() {
165         String  s = symbol + " " + String.valueOf(count" " + type;
166         if== type.compareToIgnoreCase("levels") ) {
167             for(int i=0;i<count;i++) {
168                 s   = s + "/n" + value[i];
169             }
170         }
171         else {
172             s   = s + " " + start + " " + increment;
173         }
174 /*
175         if( 0 == symbol.compareToIgnoreCase("tdef") ) {
176             String  s1  = "";
177             for(int i=0;i<count;i++) {
178                 s1  = s1 + "/n" + value[i];
179             }
180             s   = s + s1;
181         }
182 */
183         return(s);
184     }
185     public static String newDate(String yyyymmddhh, int incHours) {
186 /*
187 功能:计算yyyymmddhh加上incHours个小时后对应的日期,仍以yyyymmddhh的形式返回,出错时返回YYYYMMDDHH。
188 作者:刘泽军
189 更新:2004-11-24
190 */
191         if10 != yyyymmddhh.length() ) {
192             return("YYYYMMDDHH");
193         }
194         int yyyy, mm, dd, hh;//开始日期
195         int yyyy1, mm1, dd1, hh1;//结束日期
196         try {
197             yyyy    = Integer.parseInt(yyyymmddhh.substring(0,4));
198             mm      = Integer.parseInt(yyyymmddhh.substring(4,6));
199             dd      = Integer.parseInt(yyyymmddhh.substring(6,8));
200             hh      = Integer.parseInt(yyyymmddhh.substring(8));
201         }
202         catch(Exception ex) {
203             return("YYYYMMDDHH");
204         }
205         yyyy1   = yyyy;
206         mm1     = mm;
207         dd1     = dd;
208         hh1     = (hh+incHours24;
209         int days    = (hh + incHours - hh124;
210         ifhh1 < ) {
211             days    = days - 1;
212             hh1     = 24 + hh1;
213         }
214         //                   12   1   2   3   4   5   6   7   8   9  10  11  12
215         int daysOfMonth[] {31312831303130313130313031};
216 
217         if( (yyyy % 4== && ( (yyyy % 100!= || (yyyy % 400== ) ) {//闰年
218             daysOfMonth[2]  29;
219         }
220         ifyyyy < || yyyy + days < ||
221             yyyy >= 9999 || yyyy + days >= 9999 ||
222             mm < || mm > 12 ||
223             dd < || dd > daysOfMonth[mm] ) {
224             return("YYYYMMDDHH");
225         }
226 
227         ifdays >= ) {
228             for(int i=0;i<days;i++) {
229                 ifdd1 < daysOfMonth[mm1] ) {
230                     dd1 = dd1 + 1;
231                 }
232                 else if mm1 < 12 ) {
233                     mm1 = mm1 + 1;
234                     dd1 = 1;
235                 }
236                 else {
237                     yyyy1   = yyyy1 + 1;
238                     mm1     = 1;
239                     dd1     = 1;
240                     if( (yyyy1 % 4== && ( (yyyy1 % 100!= || (yyyy1 % 400== ) ) {//闰年
241                         daysOfMonth[2]  29;
242                     }
243                     else {
244                         daysOfMonth[2]  28;
245                     }
246                 }
247             }
248         }
249         else {
250             for(int i=days;i<0;i++) {
251                 ifdd1 > ) {
252                     dd1 = dd1 - 1;
253                 }
254                 else if mm1 > ) {
255                     mm1 = mm1 - 1;
256                     dd1 = daysOfMonth[mm1];
257                 }
258                 else {
259                     yyyy1   = yyyy1 - 1;
260                     mm1     = 12;
261                     dd1     = 31;
262                     if( (yyyy1 % 4== && ( (yyyy1 % 100!= || (yyyy1 % 400== ) ) {//闰年
263                         daysOfMonth[2]  29;
264                     }
265                     else {
266                         daysOfMonth[2]  28;
267                     }
268                 }
269             }
270         }
271         return(
272                 String.valueOf(10000+yyyy1).substring(1+
273                 String.valueOf(100+mm1).substring(1+
274                 String.valueOf(100+dd1).substring(1+
275                 String.valueOf(100+hh1).substring(1)
276         );
277     }
278 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值