数学建模社区-数学中国

标题: SAS基础宏之3:ChkDataSet [打印本页]

作者: 百年孤独    时间: 2013-7-23 16:12
标题: SAS基础宏之3:ChkDataSet
这个宏就简单了,输入一个或多个数据集,输出1或0,分别表示该数据集是否存在
9 B- R7 U! t! s. B) }! S6 }这个宏用于在其他宏中保持robust用的,如果不先确定下数据集是否存在,到时候SAS在log窗口报的错可不是那么好懂
% R! _, R: p; b; k  G
4 \& X' T0 T. @另外,如果有更好的解决我写的宏的方法,欢迎指教
0 t+ ~* z* D3 r) c: g; M  ~话说我很久之前吭哧吭哧写的一个标准化的宏,后来才发现有proc stdize8 {4 w1 X9 `+ S* ^
所以大家还要多多交流' J8 w( _0 u6 T% ~
! |3 O% C0 t) s8 s2 |! |
%macro ChkDataSet(DataSet,FlagDataSetExists);
- S1 ], _% h3 B. \( m% _  A
# t! b( f/ H2 Y/**********************************************************************/
- @) _( }8 c. R/* 此宏用于检查指定的数据集是否存在。其中,DataSet是指定的数据集,若 */
) ^; x& _1 C  Z& U# @  x1 m" J/* 需要指定具体的逻辑库,则采用逻辑库.数据库的格式,可设多个数据集, */
( U5 z, e1 |$ R/* 用空格分隔;FlagDataSetExists是标记宏变量名称,=1表示数据集存在, */4 g% t) F* n0 G- z, H
/* 否则=No,若指定了多个数据集,则不同位置上的1或0代表相应的数据集是 */6 x& H* o: V) s+ `5 n
/* 否存在。另外需要注意,第一,当仅指定一个数据集时,若不指定逻辑库名 */
3 L2 r1 r& U" h, J, U- O4 f) d/* 称,而只指定数据集名称,此时若在SAS环境中只包含一个指定的数据集, */
7 J  W3 N! _/ y2 c+ M/* 则标记宏变量FlagDataSetExists=1,若包含多个同名的数据集,则会报错;*/# V$ g0 t7 \; e% {' B% y4 b
/* 第二,当指定多个数据集时,若不指定逻辑库名称,则默认为WORK逻辑库。 */
  x9 q" E* Q9 v5 [, }/* */2 n# s. K. L. g# ]+ d
/* 最终得到的是宏变量&FlagDataSetExists,若指定数据集存在,则有 */
7 O! u' S/ S4 Z/ N: F/* &FlagDataSetExists=1,否则=0,若为多个数据集,则不同位置上的1或0代 */) [7 l* {7 w- o* l2 g. ?
/* 表相应的数据集是否存在。 */% ]# U$ l  K% U# ^  S
/* */# V/ c' O2 f* N
/* Created on 2012.11.16 */( n2 a0 L& f& {) B7 C
/* Modified on 2012.11.16 */% o/ U6 @( ^* C" p
/**********************************************************************/
4 f- U+ K& }6 s; V  Z% v
. r) q* {$ J* s4 q% ^  \/* 检查DataSet的存在性 */5 E1 }! J0 n- m. B
%if &DataSet EQ %STR( ) %then %do;
: K. ~8 ?) |* M; I0 ~& p, p%put ERROR: The DataSet should not be blank, please check it again.;- p( j4 q- I+ F  c( _
%goto exit;
9 p9 u" x3 V4 z2 ]' h%end;* ]- Z1 e9 j: l1 s; j+ Y

  V/ [) m  @5 J  |. V2 ]/* 开始进行计算 *// L. k  [9 C3 Z2 I
%global &FlagDataSetExists;
8 \& [8 }* ?# p* u1 d) s' N( B6 K6 {  M- J% P
/* 情形一:仅设定一个数据集,此时若省略逻辑库名,则在所有逻辑库中查找同名的数据集并予以报告 */1 F& y/ \% C% h! E) ?
%if %SYSFUNC(FIND(&DataSet,%STR( ))) EQ 0 %then %do;
* A# D9 Q3 q2 V7 L/* 检查DataSet的合法性 */
7 s' e* F. L. s# |1 _( |) m$ T%if %SYSFUNC(FIND(&DataSet,.)) NE 0 %then %do;
2 B9 K& y5 g. L  b%let CDS_LibName=%UPCASE(%SCAN(&DataSet,1,.));
5 U4 @. l- e+ A8 b9 h' F: ]! w%let CDS_DataSet=%UPCASE(%SCAN(&DataSet,2,.));
. H& g6 [* C5 C. I& {%end;. \+ r" A# D7 v0 Q* L! \
%else %do;
) P+ Y/ [% l, {& u3 Y%let CDS_LibName=%STR();- b/ A3 w& U9 s- Z) s6 l
%let CDS_DataSet=%UPCASE(&DataSet);
. u6 B' w& b2 h! m%end;
! N* k1 w: {! a; j7 o* S$ u" k* R1 X! i$ N3 e
%if &CDS_DataSet EQ %STR() %then %do;
) r8 a7 g% y$ D- e* z; x, M" C%put ERROR: The DataSet should not be blank, please check it again.;
6 l7 o# d% X, ?7 N6 T$ O%goto exit;) ?2 x" Z- i. S
%end;
- y; K  y( l9 u" a& K%else %if &CDS_LibName NE %STR() %then %do;2 z: L& f/ l5 w% \) p6 Q
%let &FlagDataSetExists=%SYSFUNC(EXIST(&CDS_LibName..&CDS_DataSet.));
0 }. _9 ~& R! `$ r$ a7 s%end;
" \. x9 I( `7 `1 z7 l0 M%else %do;4 h- r: B) b" ]; A& d  F9 B
proc sql noprint;
5 O3 y5 k1 d/ t' d6 Icreate table CDS_temp as
' O* Z4 Q- V4 {3 T. E8 f& }select * from sashelp.vtable
- o; F* Q7 v6 I  ^% b& iwhere memname="&CDS_DataSet";
( O% x' q& P) ]1 M4 @quit;0 D# k1 E) U0 X

7 @3 E4 E8 a0 Y" vproc sql noprint;& B9 v3 p0 s2 e+ D* C6 [
select count(*) into :CDS_DataSetNum from CDS_temp;0 v0 u% t5 j* Y4 F. Q9 f4 ]* m
quit;* O! k% N, f: k0 Q

* W+ G9 O  j3 ~5 b4 Y2 l# s%if &CDS_DataSetNum EQ 0 %then %let &FlagDataSetExists=0;
: }- n" E: C2 |6 b, Z7 v%else %if &CDS_DataSetNum EQ 1 %then %let &FlagDataSetExists=1;
0 O4 y7 g, X6 S' Y. F- N/ Y%else %do;
% N+ o/ ?) s4 }: n+ D; ~1 C9 {/ Z%put ERROR: There could be more than one DataSets with the same name appointed in different libraries, please reassign a LibName first.;
# K4 M! B* }* x! J+ Z! Y! J" U%goto exit;& h3 X: W% B' O* w* }  G$ s
%end;: ~2 ~! `7 \3 g8 ]! ~7 a: m$ u
%end;
9 z, }, _: S' I( p5 J2 }- V7 [%end;
6 }; F2 o, u4 F+ |' I& h) i/* 情形二:设定多个数据集,此时若省略逻辑库名,则默认为WORK逻辑库 */( O8 g3 v$ a: A- R
%else %do;
9 i' k, P" g1 m0 P- S%SeparateString(InputString=&DataSet,OutputString=CDS_DateSet);. K# U" z* U( V+ R' E. h

0 \3 ?' j& J' I+ {%do CDS_i=1 %to &CDS_DateSet_Num;
/ G9 Q8 m3 }5 m3 g2 F/* 检查DataSet的合法性 */2 [$ P  G# {7 L" C" p+ d% T
%if %SYSFUNC(FIND(&&CDS_DateSet_Var&CDS_i,.)) NE 0 %then %do;
' \6 X8 t) g" z: g%let CDS_LibName_&CDS_i.=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,1,.));5 q7 C' r8 S0 Q0 R% a1 k- Q
%let CDS_DataSet_&CDS_i=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,2,.));! _% R) n$ h% z
%end;
/ `8 R; ~0 {9 x  K%else %do;
- x: a! M/ Y- `4 v) l6 f7 a%let CDS_LibName_&CDS_i.=WORK;
( d$ h, h4 R. a% n) ~4 @0 K  f2 ~%let CDS_DataSet_&CDS_i.=%UPCASE(&&CDS_DateSet_Var&CDS_i);
  \+ {5 a  f7 H7 O8 o%end;
' E, v! i$ t. z: C2 E8 e  i7 f
+ |& Y  n7 S3 p$ a$ P7 ?' ^%let CDS_FlagDataSetExists_&CDS_i.=%SYSFUNC(EXIST(&&CDS_LibName_&CDS_i...&&CDS_DataSet_&CDS_i.));
4 |/ X. K' o4 O* y. t%end;7 E: [' s/ ^% {5 N! ]! P" T
% ]  H7 i8 Z, a& n1 \3 K5 p, A2 u+ g
%let &FlagDataSetExists=&&CDS_FlagDataSetExists_1;
% k" E. a3 C7 f9 S7 M  W# b9 t1 P, w$ E4 D6 @5 ^
%do CDS_j=2 %to &CDS_DateSet_Num;
* ?+ B3 g+ X( T8 O1 i* Z%let &FlagDataSetExists=&&&FlagDataSetExists.&&CDS_FlagDataSetExists_&CDS_j;. P$ T6 |  f* l0 U0 C3 R
%end;: Z# |) Y' w( n$ K/ Q( Z: _
%end;  L5 C4 {0 c* n) ^  x/ N2 w

3 Y& K2 {3 X. y8 o/* 如果想要输出结果,请取消下面的注释 */+ Q' O6 \% V' c+ R3 c2 T! N
/*%put &&&FlagDataSetExists;*// N- ~- G7 ]; ~2 g

- ]$ a: J" {# L  N' I7 L4 K5 B/* 删除不必要的表格 */% E. I2 }; Y# s& p  w
proc datasets lib=work nolist;8 u4 l: y% \$ D
delete CDS_temp;9 [4 R( D, A, [
quit;
, V( P+ \' f7 r7 L+ G) Q2 i! r) E# J& s/ T2 P1 P

: N. I) s; m1 i1 Z%exit:
$ K" m+ Z: R0 H3 o) J%mend;2 @. r+ s: {: Q% q( o' q. Z

& F. k$ ~- L) v0 r; l
6 Y; E  w9 I  L4 w' l%macro Demo();1 O' }4 _# e1 u/ H
1 h! H* x0 o4 h/ m. m
%let DataSet=Gfl_fundcodelist_mgrname Gfl_managersoffund; /* 数据集名称,可设为多个,用空格分隔 */# P; U" g5 O6 o2 j9 q9 i
%let FlagDataSetExists=FlagDataSetExists1; /* 宏变量的名称,注意不能与参数名称相同*/. ^# X- B3 @1 H$ g! d+ n
%ChkDataSet(&DataSet,&FlagDataSetExists);
/ @3 Y. Z& \& g' B- V6 b; C, |1 o
%put &FlagDataSetExists1;0 z+ d( [% M+ `$ W2 l- }% n4 D: {3 T9 O

3 L6 L8 G4 y4 ^2 X%mend;




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5