数学建模社区-数学中国

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

作者: 百年孤独    时间: 2013-7-23 16:12
标题: SAS基础宏之3:ChkDataSet
这个宏就简单了,输入一个或多个数据集,输出1或0,分别表示该数据集是否存在
/ J2 ]  z9 o9 `, |% X, Q+ [* j/ f这个宏用于在其他宏中保持robust用的,如果不先确定下数据集是否存在,到时候SAS在log窗口报的错可不是那么好懂9 R; \; I' l" R4 S9 s; n" M
2 U6 E6 c; |8 O. ^* C, @, p
另外,如果有更好的解决我写的宏的方法,欢迎指教
9 w9 l% l: R  f6 o& y话说我很久之前吭哧吭哧写的一个标准化的宏,后来才发现有proc stdize5 g  e1 V, H# N7 ]
所以大家还要多多交流
& U; p  A# i3 l; _( L; N8 [4 }) y7 z$ q! [( E- i  C' O# j5 W
%macro ChkDataSet(DataSet,FlagDataSetExists);
2 H) x% f( W: Q0 B/ [' L# H+ Z  h" M1 @" }3 c& ?( ]+ h
/**********************************************************************/
+ g, m7 _; e  M2 \/ S1 L& i/* 此宏用于检查指定的数据集是否存在。其中,DataSet是指定的数据集,若 */. U2 G: i/ o0 w
/* 需要指定具体的逻辑库,则采用逻辑库.数据库的格式,可设多个数据集, */
0 Y2 w4 S, x9 |+ J) y3 N- l/* 用空格分隔;FlagDataSetExists是标记宏变量名称,=1表示数据集存在, */
! g) d4 n* k0 Z7 |/* 否则=No,若指定了多个数据集,则不同位置上的1或0代表相应的数据集是 */
: u) W% I) u! m  ~/* 否存在。另外需要注意,第一,当仅指定一个数据集时,若不指定逻辑库名 */
2 G  |+ c9 j6 o$ [/* 称,而只指定数据集名称,此时若在SAS环境中只包含一个指定的数据集, */) Q: G" W2 R  O2 ~! E" U
/* 则标记宏变量FlagDataSetExists=1,若包含多个同名的数据集,则会报错;*/
0 ?" y/ X+ |! {: Z* _+ h! S2 Z/* 第二,当指定多个数据集时,若不指定逻辑库名称,则默认为WORK逻辑库。 */
3 r# P( g; O6 j9 V: E/* */
- [; W& \2 q: Z9 B" m9 e/* 最终得到的是宏变量&FlagDataSetExists,若指定数据集存在,则有 */  s: A' J/ u3 f- j
/* &FlagDataSetExists=1,否则=0,若为多个数据集,则不同位置上的1或0代 */# Y' e# C# ^) H" m
/* 表相应的数据集是否存在。 */
& u  l* k# K" l) P) ?! |/* */) x: e2 o4 j& i$ }
/* Created on 2012.11.16 *// D: |5 n" z$ s8 \6 ]. e& W
/* Modified on 2012.11.16 */8 o; X9 n  O+ y( @1 D/ ^
/**********************************************************************/: J' M+ k9 X$ L6 Z) h! l7 X

! e1 a5 C9 T" F, y/* 检查DataSet的存在性 */
7 n/ j" _, G- H" b%if &DataSet EQ %STR( ) %then %do;% i+ e9 E; L% W" c7 }, I2 o/ U
%put ERROR: The DataSet should not be blank, please check it again.;$ ^8 F: ^% _2 E* U2 h; }" v
%goto exit;2 [4 x/ S) Y& y; y' u5 D
%end;
5 d: \" h* D' s" o( t. Y
. v9 m1 e8 g" t- z+ @/* 开始进行计算 */3 V% q! `, ?$ T
%global &FlagDataSetExists;
2 C1 Q3 i9 M* m; a* z9 {5 M! p3 |
+ V# A9 W* I4 O! C( t) E. o( N/* 情形一:仅设定一个数据集,此时若省略逻辑库名,则在所有逻辑库中查找同名的数据集并予以报告 */
! T0 A& D5 T7 W7 Z3 i7 t%if %SYSFUNC(FIND(&DataSet,%STR( ))) EQ 0 %then %do;# ^' j1 H6 G9 l- M! H7 T; |
/* 检查DataSet的合法性 */
% V5 y0 E2 Y+ q3 b& i2 e%if %SYSFUNC(FIND(&DataSet,.)) NE 0 %then %do;. k1 W; l+ p2 f- z: e: M& S+ S5 S
%let CDS_LibName=%UPCASE(%SCAN(&DataSet,1,.));7 ]) n+ J! G0 n; G9 L+ `' F
%let CDS_DataSet=%UPCASE(%SCAN(&DataSet,2,.));
; g% f9 y" X! L5 T, d%end;. d5 s: `, ?* x" O4 h
%else %do;' E$ z& N  B# w
%let CDS_LibName=%STR();7 h& X- t! u( h
%let CDS_DataSet=%UPCASE(&DataSet);, }/ q2 R3 i+ g) w9 n. T6 q- B8 S
%end;0 O0 r6 g+ Q  U) |% [% M; R" T4 I# p
8 m' T! H: A) }* v
%if &CDS_DataSet EQ %STR() %then %do;" c! {+ ^8 Z% Q5 r& t# H5 S
%put ERROR: The DataSet should not be blank, please check it again.;2 f4 r3 X( m$ z* L! q" U: R, @
%goto exit;7 @1 _9 T3 z# }9 J3 ]8 ^! X
%end;
3 Q4 ^# W4 I$ r$ h/ c% p6 y8 G$ g%else %if &CDS_LibName NE %STR() %then %do;
0 i$ i" C* J, l& `0 Y4 F" }4 z%let &FlagDataSetExists=%SYSFUNC(EXIST(&CDS_LibName..&CDS_DataSet.));
9 g4 m7 K' P3 C: L) t4 Q1 l6 S%end;
% \8 M8 f2 S3 O8 r2 g% s%else %do;) d, ?3 ]6 P, m! F8 O, y
proc sql noprint;
& k' _7 l6 m6 L8 S5 R6 v  r! H( qcreate table CDS_temp as: V! m% m7 ?8 e0 w8 _3 B  w
select * from sashelp.vtable$ D' `4 k1 S+ Z  h9 ^4 s1 d$ R6 f
where memname="&CDS_DataSet";- K; x6 W$ @0 w0 B7 D0 @2 i7 n* A
quit;
) C* s. O& e* ^6 z9 C% v8 O) S+ T. E' }/ o" A
proc sql noprint;1 z5 S# K9 a+ S' V4 f
select count(*) into :CDS_DataSetNum from CDS_temp;- T" e) `4 S% r& C+ x7 \& k4 l
quit;1 P8 L$ s7 Q* G/ i) b- ^6 [7 F

* K4 t$ ^& I7 x1 W, p5 `9 x1 ?4 I  l%if &CDS_DataSetNum EQ 0 %then %let &FlagDataSetExists=0;
( c5 m2 E3 V) z. ?+ U% i0 D$ M%else %if &CDS_DataSetNum EQ 1 %then %let &FlagDataSetExists=1;% z6 B1 g. N# {% c/ M  `
%else %do;
9 p0 O& h. j' y' o8 z- _1 {3 o& H4 D%put ERROR: There could be more than one DataSets with the same name appointed in different libraries, please reassign a LibName first.;
# ^6 |2 h3 a+ |; ?, q  O# ]%goto exit;" E( ~6 K0 |& A* n+ L, K
%end;
" g) O+ T4 C4 A+ u8 V%end;# o9 {( U1 I1 M6 i, [
%end;$ \% _; R. S/ o/ W% K
/* 情形二:设定多个数据集,此时若省略逻辑库名,则默认为WORK逻辑库 */
3 j$ q6 A9 P' j8 [4 j# h%else %do;* r5 x) q8 m& t" ]3 a" `
%SeparateString(InputString=&DataSet,OutputString=CDS_DateSet);. u0 I2 k, `: f3 T% w' V

  j% d: \0 T9 x: r6 I1 ^; m5 C%do CDS_i=1 %to &CDS_DateSet_Num;- S& J# a; S+ W& h) F  b+ r
/* 检查DataSet的合法性 */
/ Y8 L( B$ c, Q( g! K%if %SYSFUNC(FIND(&&CDS_DateSet_Var&CDS_i,.)) NE 0 %then %do;- L# |' ?, d3 I; ]" I
%let CDS_LibName_&CDS_i.=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,1,.));5 ~; K0 ~: U0 ?
%let CDS_DataSet_&CDS_i=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,2,.));5 T% G# C# I7 s9 B: ]
%end;7 y- K" O$ ]" j; l* g+ ?0 v( v
%else %do;' B2 Q7 k- d. l% B
%let CDS_LibName_&CDS_i.=WORK;
/ w( l0 D! f, r1 L%let CDS_DataSet_&CDS_i.=%UPCASE(&&CDS_DateSet_Var&CDS_i);
8 C* Y+ C* Y7 M8 Y4 Q%end;$ K2 i0 U5 `; C' h; z" Q

, N/ u% L/ z' y% e$ T( l7 |- F' y%let CDS_FlagDataSetExists_&CDS_i.=%SYSFUNC(EXIST(&&CDS_LibName_&CDS_i...&&CDS_DataSet_&CDS_i.));
, e* o# x( S1 E%end;, d1 N5 y; Q2 e

+ l+ n4 \% ]1 p4 [7 T" K' m+ O! f%let &FlagDataSetExists=&&CDS_FlagDataSetExists_1;
' k! B8 @: V( R
7 d* s5 _8 x0 b; ?8 M' O2 {( ~%do CDS_j=2 %to &CDS_DateSet_Num;
- B: ^  B- r* O%let &FlagDataSetExists=&&&FlagDataSetExists.&&CDS_FlagDataSetExists_&CDS_j;
( c( p% @0 e1 u. q%end;
3 s: i$ p) M/ \+ i%end;' z# s8 g- i) E! t
& E8 y% ?: Q1 P  e* w, }( q6 x' z
/* 如果想要输出结果,请取消下面的注释 */
5 o) F* g7 E, V/ }8 X/*%put &&&FlagDataSetExists;*/' x1 |& m: F1 r' I( {/ W
9 u  D- q/ {/ M6 [
/* 删除不必要的表格 */
$ n/ \5 y- w$ E6 Bproc datasets lib=work nolist;. T1 {: |" T! }$ ~& B
delete CDS_temp;0 c6 S/ Z- m" W5 r8 d
quit;5 p2 [& U2 D7 B& ]! R: a: U
; }, U) a4 U4 s+ N2 [$ E. G

6 g0 N0 M( e/ C6 u3 ?) \' q7 a%exit:
& t+ T+ d! Q+ R/ Z+ l%mend;4 \& T# H  p0 y& V2 v# ^
! Z( H% s+ a# H( o" T* Z
% V4 e" [; R6 O" N; H* v
%macro Demo();4 n7 w# H" b% a* o% B) a0 r

- ], o' ]5 Y9 v%let DataSet=Gfl_fundcodelist_mgrname Gfl_managersoffund; /* 数据集名称,可设为多个,用空格分隔 */' \( E* U6 j: k' P& u6 s
%let FlagDataSetExists=FlagDataSetExists1; /* 宏变量的名称,注意不能与参数名称相同*/
9 v) u2 \3 ~6 g7 e# l2 U%ChkDataSet(&DataSet,&FlagDataSetExists);
9 [+ H" C& _/ ^
: r6 T1 N5 J% g%put &FlagDataSetExists1;
! y- w" h1 d& i" N  z
9 W# h. Y! Q0 S8 U' ^%mend;




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