数学建模社区-数学中国
标题:
SAS基础宏之3:ChkDataSet
[打印本页]
作者:
百年孤独
时间:
2013-7-23 16:12
标题:
SAS基础宏之3:ChkDataSet
这个宏就简单了,输入一个或多个数据集,输出1或0,分别表示该数据集是否存在
/ S. v2 d( n: L- O' Z+ w
这个宏用于在其他宏中保持robust用的,如果不先确定下数据集是否存在,到时候SAS在log窗口报的错可不是那么好懂
5 s1 T) v# f2 z5 u% U1 I' c
7 j8 p$ d H/ Z) N! z
另外,如果有更好的解决我写的宏的方法,欢迎指教
; H4 Q% k. _' y( F/ }# Q: v
话说我很久之前吭哧吭哧写的一个标准化的宏,后来才发现有proc stdize
. g6 a! j4 q" d7 F; v* o1 e4 q, F
所以大家还要多多交流
# e' m. T) e+ a( u
4 w/ U Q* S0 F5 V- v" U% `2 i4 |
%macro ChkDataSet(DataSet,FlagDataSetExists);
( o6 D7 U. G `0 { ^) T8 p% s
1 I$ q! c, u' |- Z
/**********************************************************************/
& h g) R2 ~" ]+ H8 q
/* 此宏用于检查指定的数据集是否存在。其中,DataSet是指定的数据集,若 */
1 ^' c1 Y1 v4 m* ?3 P
/* 需要指定具体的逻辑库,则采用逻辑库.数据库的格式,可设多个数据集, */
3 C, S4 c4 W/ t* o3 F$ Y" w( q
/* 用空格分隔;FlagDataSetExists是标记宏变量名称,=1表示数据集存在, */
8 A0 W: B9 d) i6 T! {6 E# H' Z
/* 否则=No,若指定了多个数据集,则不同位置上的1或0代表相应的数据集是 */
* y) j% Q' |3 s& ]4 X/ f, q: l
/* 否存在。另外需要注意,第一,当仅指定一个数据集时,若不指定逻辑库名 */
. p. f) A* Y$ t: n5 j) C
/* 称,而只指定数据集名称,此时若在SAS环境中只包含一个指定的数据集, */
# c$ b" S- q" B0 Y; J
/* 则标记宏变量FlagDataSetExists=1,若包含多个同名的数据集,则会报错;*/
- }' c5 j, s3 ?
/* 第二,当指定多个数据集时,若不指定逻辑库名称,则默认为WORK逻辑库。 */
# g6 @. \$ c8 S3 L. a
/* */
. \8 G! \2 }' V1 R8 \% W" ]
/* 最终得到的是宏变量&FlagDataSetExists,若指定数据集存在,则有 */
# q8 u' V6 V! O2 a3 s1 D
/* &FlagDataSetExists=1,否则=0,若为多个数据集,则不同位置上的1或0代 */
* d2 B: Z* C& Y. {, j
/* 表相应的数据集是否存在。 */
5 h. Q. c0 J- ^* Z4 T; M O
/* */
" |) [, f! j9 ?0 d
/* Created on 2012.11.16 */
$ _( J5 A d4 q& y! y' }) [! }7 s/ K
/* Modified on 2012.11.16 */
. i n r6 t& X6 m% P6 P" i
/**********************************************************************/
8 I( E7 _9 k* g. L$ H
4 e6 Q' h1 J: R$ O) n+ `6 U, R
/* 检查DataSet的存在性 */
/ s# v' G# y3 C v: q1 r& d
%if &DataSet EQ %STR( ) %then %do;
/ n, m% T1 E( D8 t* F2 z
%put ERROR: The DataSet should not be blank, please check it again.;
6 Y& }" t& {# {* `! S
%goto exit;
' p9 T+ L9 m+ P) e* B/ M$ G
%end;
5 X! i q0 v! ?$ X
4 h) @, ?+ {4 m* q M! C
/* 开始进行计算 */
3 d* ^0 ]8 E1 |+ Y
%global &FlagDataSetExists;
7 ]4 {* d# x9 v# }& j9 n1 E( E
( w* I- _+ R# H! Q( Z8 {
/* 情形一:仅设定一个数据集,此时若省略逻辑库名,则在所有逻辑库中查找同名的数据集并予以报告 */
7 n, L1 a! W1 D. A
%if %SYSFUNC(FIND(&DataSet,%STR( ))) EQ 0 %then %do;
9 n$ e7 P+ _7 e
/* 检查DataSet的合法性 */
1 W2 Y3 g" V3 Y4 T
%if %SYSFUNC(FIND(&DataSet,.)) NE 0 %then %do;
9 L0 r: M/ ^/ _- P* i
%let CDS_LibName=%UPCASE(%SCAN(&DataSet,1,.));
/ B8 P' `2 B0 D' `! Z
%let CDS_DataSet=%UPCASE(%SCAN(&DataSet,2,.));
0 U4 t$ ~% o! k! D& T. b
%end;
/ N, L% }# [* Z
%else %do;
e& t, ]2 B9 n# X' k& S
%let CDS_LibName=%STR();
) z6 r7 H& C. D+ C
%let CDS_DataSet=%UPCASE(&DataSet);
4 n" Z8 d Q8 r/ R# F( _, c& T
%end;
. d( q; ]: l2 f
1 \, z' j+ C: c
%if &CDS_DataSet EQ %STR() %then %do;
* D7 `: P% K9 z9 U
%put ERROR: The DataSet should not be blank, please check it again.;
5 g( b) b* @( i* A0 z, U {
%goto exit;
j: H+ d; T. a6 P6 i- Y
%end;
, q k( Z1 U- Y% j) f
%else %if &CDS_LibName NE %STR() %then %do;
1 b/ I* S9 H# V u6 s/ R
%let &FlagDataSetExists=%SYSFUNC(EXIST(&CDS_LibName..&CDS_DataSet.));
" g9 J1 [4 u1 `7 A% g) }" d
%end;
% M: ^' k4 ^7 y: c; G* V: d
%else %do;
/ y G" ^1 m$ T
proc sql noprint;
5 c8 d+ Z& N/ a v
create table CDS_temp as
1 N8 C U; Q; L7 v
select * from sashelp.vtable
1 f% Y! P' w0 z' U* Y3 D" i( K
where memname="&CDS_DataSet";
4 @" V$ f& F4 C% n B9 d9 Y
quit;
7 h0 {+ \3 G* M$ H' u+ _
8 ?* v/ ?* U7 T' I) M+ X) ]7 \+ d
proc sql noprint;
' z: r" L" ]; M6 u( s7 f
select count(*) into :CDS_DataSetNum from CDS_temp;
[7 V* A8 U `0 Z: j) M1 y2 U
quit;
! y9 {7 }5 E: k3 F0 P
|: ?" U# G8 D
%if &CDS_DataSetNum EQ 0 %then %let &FlagDataSetExists=0;
' y, a( p5 i: H. |* w3 ]& f
%else %if &CDS_DataSetNum EQ 1 %then %let &FlagDataSetExists=1;
- y, z+ d( i- d8 n) ~
%else %do;
" m2 d0 k/ i8 f6 T7 |/ \
%put ERROR: There could be more than one DataSets with the same name appointed in different libraries, please reassign a LibName first.;
2 J. }- S! i9 F5 C: i
%goto exit;
/ r/ T$ L" q( f0 J% E
%end;
& j# d0 @% O8 H. s- L
%end;
8 R; ]* V2 ]2 ]' D8 M% \) N& h
%end;
/ w+ C" Y% z+ x0 i: _% }9 n' p
/* 情形二:设定多个数据集,此时若省略逻辑库名,则默认为WORK逻辑库 */
& L9 c) k$ r1 X0 c6 W/ ?4 p6 ?# ?
%else %do;
" [ A/ u# J, c& w
%SeparateString(InputString=&DataSet,OutputString=CDS_DateSet);
( v! o P; f/ r: i( d4 {. T
7 f" V8 r4 S3 W
%do CDS_i=1 %to &CDS_DateSet_Num;
I1 y% o9 q& R! V! X1 i
/* 检查DataSet的合法性 */
! U+ N3 y) t6 V: f3 r
%if %SYSFUNC(FIND(&&CDS_DateSet_Var&CDS_i,.)) NE 0 %then %do;
/ o* H/ J6 ^9 D6 j6 f$ {
%let CDS_LibName_&CDS_i.=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,1,.));
. p& o8 x7 F, W& [6 i# j
%let CDS_DataSet_&CDS_i=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,2,.));
5 R+ \3 ^" Q( c$ F* o( m
%end;
8 \) x, s- T' U
%else %do;
$ H1 r" }, G" g# `0 h0 ?
%let CDS_LibName_&CDS_i.=WORK;
+ M5 C# t3 `" S4 F% J: z
%let CDS_DataSet_&CDS_i.=%UPCASE(&&CDS_DateSet_Var&CDS_i);
' j% L1 ~7 s$ z$ r/ }
%end;
6 N' j. U* _4 y; e" c6 g$ c5 w( F
' {# t9 m% |& B% }, j4 ^/ |- O
%let CDS_FlagDataSetExists_&CDS_i.=%SYSFUNC(EXIST(&&CDS_LibName_&CDS_i...&&CDS_DataSet_&CDS_i.));
3 ?" F8 x d8 ^! Q
%end;
9 Y- C* e3 {; ^& ^, o2 c
' J1 S5 Z' N4 n; f- Z, r
%let &FlagDataSetExists=&&CDS_FlagDataSetExists_1;
: f! H4 t$ s2 B2 x! v% m0 V1 m& U; p5 w
0 |& y0 ~9 R2 z$ V; H& m
%do CDS_j=2 %to &CDS_DateSet_Num;
' P! r! O. ^0 E9 @0 Y8 v
%let &FlagDataSetExists=&&&FlagDataSetExists.&&CDS_FlagDataSetExists_&CDS_j;
( D/ ^- d; o' R; F* x* ], @. @
%end;
6 v8 ~% |5 z3 u2 x
%end;
/ ?8 W+ g$ U5 z
9 b' b4 ?" i( a/ A
/* 如果想要输出结果,请取消下面的注释 */
7 U, h) x7 [# V D
/*%put &&&FlagDataSetExists;*/
$ M9 {) T0 ?, T7 h7 T' [& M
) c- O6 ?" L5 D- {7 ^
/* 删除不必要的表格 */
1 a: T1 @* l; N3 V$ F+ C
proc datasets lib=work nolist;
$ Q3 i0 ?! P* H! n- f# H$ Q) M' [. ?
delete CDS_temp;
+ W% t( S" h* Q- W) v
quit;
$ B5 L, V, j# g, R/ x
$ w* m/ {, g9 O, u2 @( o+ Y- A: w
) ^: m$ L* W4 I4 r0 Z3 ^) H! Z; C
%exit:
! e6 N5 W! N4 V0 L
%mend;
' P! g+ u C5 O5 C/ T
/ D: A" p4 F+ k! U! o( k* z
/ ]' o6 ~3 m& i- Q
%macro Demo();
# D) {; g" E2 e" G+ y
* G" W: F- L. Y
%let DataSet=Gfl_fundcodelist_mgrname Gfl_managersoffund; /* 数据集名称,可设为多个,用空格分隔 */
7 y. K& t6 t- E# y
%let FlagDataSetExists=FlagDataSetExists1; /* 宏变量的名称,注意不能与参数名称相同*/
. x3 b O8 I6 T, U5 Q7 v
%ChkDataSet(&DataSet,&FlagDataSetExists);
8 d3 |4 Z5 d0 y1 R" h
# O8 e" [6 c2 k" j) \* ]* g/ ?9 ?
%put &FlagDataSetExists1;
$ V: G6 N X3 R5 }- t7 O
! {+ f" R: \' M6 ?8 j. D; B
%mend;
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5