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

2 篇文章 0 订阅

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           return name +  " "  + 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           if str.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                   if str [ 4 ] .toLowerCase () .endsWith ( "mn" ) ) {
076                       intIncrement   = Integer.parseInt ( str [ 4 ] .substring ( 0 ,str [ 4 ] .toLowerCase () .indexOf ( "mn" ))) ;
077                       if intIncrement >=  60 ) {
078                           intIncrement    = intIncrement /  60 ;
079                           suffix  =  "hr" ;
080                       }
081                       else  {
082                           suffix  =  "mn" ;
083                       }
084                   }
085                   else if str [ 4 ] .toLowerCase () .endsWith ( "hr" ) ) {
086                       intIncrement   = Integer.parseInt ( str [ 4 ] .substring ( 0 ,str [ 4 ] .toLowerCase () .indexOf ( "hr" ))) ;
087                       if intIncrement >=  24 ) {
088                           intIncrement    = intIncrement /  24 ;
089                           suffix  =  "dy" ;
090                       }
091                       else  {
092                           suffix  =  "hr" ;
093                       }
094                   }
095                   else if str [ 4 ] .toLowerCase () .endsWith ( "dy" ) ) {
096                       intIncrement   = Integer.parseInt ( str [ 4 ] .substring ( 0 ,str [ 4 ] .toLowerCase () .indexOf ( "dy" ))) ;
097                       suffix  =  "dy" ;
098                   }
099                   else if str [ 4 ] .toLowerCase () .endsWith ( "mo" ) ) {
100                       intIncrement   = Integer.parseInt ( str [ 4 ] .substring ( 0 ,str [ 4 ] .toLowerCase () .indexOf ( "mo" ))) ;
101                       suffix  =  "mo" ;
102                   }
103                   else if str [ 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                       while value [ 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                       if str.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                   if symbol.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           if 10  != 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+incHours 24 ;
209           int  days    =  ( hh + incHours - hh1 24 ;
210           if hh1 <  ) {
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 []  { 31 31 28 31 30 31 30 31 31 30 31 30 31 } ;
216 
217           if ( ( yyyy %  4 ==  &&  ( ( yyyy %  100 !=  ||  ( yyyy %  400 ==  ) ) { //闰年
218               daysOfMonth [ 2 ]   29 ;
219           }
220           if yyyy <  || yyyy + days <  ||
221               yyyy >=  9999  || yyyy + days >=  9999  ||
222               mm <  || mm >  12  ||
223               dd <  || dd > daysOfMonth [ mm ] ) {
224               return ( "YYYYMMDDHH" ) ;
225           }
226 
227           if days >=  ) {
228               for ( int  i= 0 ;i<days;i++ ) {
229                   if dd1 < 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                   if dd1 >  ) {
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、付费专栏及课程。

余额充值