数学建模社区-数学中国
标题:
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 stdize
5 g e1 V, H# N7 ]
所以大家还要多多交流
& U; p A# i3 l; _( L; N8 [4 }) y
7 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( q
create 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 B
proc 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