数学建模社区-数学中国
标题:
SAS基础宏之3:ChkDataSet
[打印本页]
作者:
百年孤独
时间:
2013-7-23 16:12
标题:
SAS基础宏之3:ChkDataSet
这个宏就简单了,输入一个或多个数据集,输出1或0,分别表示该数据集是否存在
. y, h3 ~2 W; l! @
这个宏用于在其他宏中保持robust用的,如果不先确定下数据集是否存在,到时候SAS在log窗口报的错可不是那么好懂
* \, F% v0 p: l; C* ]! q9 j
# n* F5 b7 Q8 f1 [. X' H( I/ h* S
另外,如果有更好的解决我写的宏的方法,欢迎指教
( b5 V2 {, Z3 P2 W; v% P
话说我很久之前吭哧吭哧写的一个标准化的宏,后来才发现有proc stdize
( M3 f9 K0 t" B- u3 X: Y
所以大家还要多多交流
4 D* Z- T9 h( w ^0 L& h/ k
8 Q9 H- E6 \2 {' q
%macro ChkDataSet(DataSet,FlagDataSetExists);
! M! B( L! A3 Q# K
/ T- U2 r* J/ Q _0 w/ l& m
/**********************************************************************/
/ L/ \6 J$ u( I2 K9 |* S8 d# B
/* 此宏用于检查指定的数据集是否存在。其中,DataSet是指定的数据集,若 */
4 _7 m" n( }: r/ f. v. n5 e2 Y
/* 需要指定具体的逻辑库,则采用逻辑库.数据库的格式,可设多个数据集, */
) B' s5 U0 \+ t% [
/* 用空格分隔;FlagDataSetExists是标记宏变量名称,=1表示数据集存在, */
3 D$ p3 X# A' z7 l- O0 C# R+ u7 c; H
/* 否则=No,若指定了多个数据集,则不同位置上的1或0代表相应的数据集是 */
& ]. ?- z' m8 C0 r2 `7 V
/* 否存在。另外需要注意,第一,当仅指定一个数据集时,若不指定逻辑库名 */
+ ^6 W% N: y, b! D: U
/* 称,而只指定数据集名称,此时若在SAS环境中只包含一个指定的数据集, */
2 n2 M$ \ Q" W4 R) S2 Y" ]5 W& `
/* 则标记宏变量FlagDataSetExists=1,若包含多个同名的数据集,则会报错;*/
* o. l+ ]9 j! t! |; @. C H! s
/* 第二,当指定多个数据集时,若不指定逻辑库名称,则默认为WORK逻辑库。 */
- N- P+ `+ c* `& w! q" U O
/* */
?2 N3 Q2 q4 m C( K5 H0 }. n
/* 最终得到的是宏变量&FlagDataSetExists,若指定数据集存在,则有 */
; r7 P* i) \1 j
/* &FlagDataSetExists=1,否则=0,若为多个数据集,则不同位置上的1或0代 */
* ~, o+ Q' N1 |% b% I# Z$ P
/* 表相应的数据集是否存在。 */
8 o B1 v, N7 k1 y6 q6 e
/* */
! n! Z2 `$ V4 Z: N* @; ^7 h
/* Created on 2012.11.16 */
+ d9 u0 ]' o: z
/* Modified on 2012.11.16 */
7 s, e8 T6 E) @
/**********************************************************************/
3 c# J/ ?$ k3 ^% C" z
* i' P/ d6 O C7 B6 ]( w8 |( Y; r8 j
/* 检查DataSet的存在性 */
" \1 n; n- h* J/ s9 D7 X$ ^
%if &DataSet EQ %STR( ) %then %do;
2 _9 ^$ x+ f! d4 ?+ l! z- n+ Y" `
%put ERROR: The DataSet should not be blank, please check it again.;
" B- v, B4 E( D2 M; _' W8 u: h o. t! A
%goto exit;
0 D$ U! D! T5 x- d- m
%end;
/ @' Y2 h+ u! V5 A/ `
; j- R! R m6 R3 j6 E; J
/* 开始进行计算 */
1 N; `" i- z |. M, [8 N$ X
%global &FlagDataSetExists;
: [; V# F% @ W7 J
- u% L+ A7 J0 F( j
/* 情形一:仅设定一个数据集,此时若省略逻辑库名,则在所有逻辑库中查找同名的数据集并予以报告 */
& K3 X! n D! U0 t6 E3 S$ |/ s
%if %SYSFUNC(FIND(&DataSet,%STR( ))) EQ 0 %then %do;
, ` H; I. r: l! w7 g6 E6 c, O
/* 检查DataSet的合法性 */
: r" }: l8 ~+ V
%if %SYSFUNC(FIND(&DataSet,.)) NE 0 %then %do;
+ u. h3 Y4 C: e) x
%let CDS_LibName=%UPCASE(%SCAN(&DataSet,1,.));
5 }4 |+ j+ s& J# e
%let CDS_DataSet=%UPCASE(%SCAN(&DataSet,2,.));
4 Y2 m+ o1 ?# [* B
%end;
, i; h$ q! h4 _5 @
%else %do;
! F: r+ _# E1 n t
%let CDS_LibName=%STR();
/ s0 k2 o+ R% X5 @/ @* v3 I+ n
%let CDS_DataSet=%UPCASE(&DataSet);
0 U4 M+ s, x' ~# H$ q3 w0 O
%end;
Z8 d8 R% w8 k$ E9 Y& i
( z7 g7 N1 v; T* b- ? E
%if &CDS_DataSet EQ %STR() %then %do;
3 k: S- ]9 X5 g# d4 u) W/ @
%put ERROR: The DataSet should not be blank, please check it again.;
9 y( U/ `7 B7 \2 P6 ]+ a
%goto exit;
% m! [6 Q. o" ~5 i; w7 s
%end;
: _. o( A6 q. T9 x4 W* y% P
%else %if &CDS_LibName NE %STR() %then %do;
% t9 b: A* p. i1 f N; V6 Y% f
%let &FlagDataSetExists=%SYSFUNC(EXIST(&CDS_LibName..&CDS_DataSet.));
6 S6 i; D( t: I
%end;
4 `, s3 v5 Z. E) F* u( v/ A
%else %do;
1 G4 D, ?. N( C3 r
proc sql noprint;
, ^7 P1 F6 s& ~/ U" Q
create table CDS_temp as
D; s: c8 c+ {+ p2 h8 e3 |3 k
select * from sashelp.vtable
# e* X1 D8 ]+ X+ f6 q- ^
where memname="&CDS_DataSet";
" y& C8 e l: k) ?( b. G( p7 N
quit;
! l5 l7 n S0 e6 H2 g4 W$ b
: A# _* L4 J% J: ?. B3 j
proc sql noprint;
+ Z: K% b- ~$ Q- l3 x
select count(*) into :CDS_DataSetNum from CDS_temp;
0 n' X2 o6 S( U, C
quit;
7 L% M% E0 |4 @% ]9 G% o+ \
" n ?# R) ]2 c* e: @1 `
%if &CDS_DataSetNum EQ 0 %then %let &FlagDataSetExists=0;
' [; e) ?) k7 a5 E! Y$ ?9 `; d+ R
%else %if &CDS_DataSetNum EQ 1 %then %let &FlagDataSetExists=1;
4 s1 u4 j' J# K7 E4 v3 k
%else %do;
7 V( d% E) b3 B6 V4 D
%put ERROR: There could be more than one DataSets with the same name appointed in different libraries, please reassign a LibName first.;
( G8 o7 b9 t' \; `$ \( J
%goto exit;
9 D) }. \. Y! U1 o0 b
%end;
/ {4 J! i6 S- |2 h' H. E4 L
%end;
- a9 [7 ]; U& k2 ?* i% E2 k3 r Y
%end;
+ w2 E/ `2 v2 C) p' U
/* 情形二:设定多个数据集,此时若省略逻辑库名,则默认为WORK逻辑库 */
4 f! \! [: |4 Y8 n
%else %do;
; V( h8 I7 C! U% W
%SeparateString(InputString=&DataSet,OutputString=CDS_DateSet);
) A H/ I1 _0 S# l9 N
) Y" ?" I% {# [/ j: K
%do CDS_i=1 %to &CDS_DateSet_Num;
$ v9 H3 Z( i: I A
/* 检查DataSet的合法性 */
- G% y2 r5 p9 V( ^- X' ]8 V
%if %SYSFUNC(FIND(&&CDS_DateSet_Var&CDS_i,.)) NE 0 %then %do;
+ o/ r# {* e& g( A$ e" E9 ]8 E
%let CDS_LibName_&CDS_i.=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,1,.));
2 G1 [8 K# ~5 C( M4 N) w! F& }8 y: l
%let CDS_DataSet_&CDS_i=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,2,.));
7 [4 y! G9 \1 ^: ]3 O
%end;
( b; ]2 c: g# @9 Y* X. z9 ~% Q
%else %do;
! _* z+ b7 ]0 ]8 A1 B
%let CDS_LibName_&CDS_i.=WORK;
* L, y7 I7 y: |9 y$ W
%let CDS_DataSet_&CDS_i.=%UPCASE(&&CDS_DateSet_Var&CDS_i);
/ j% O, k# r" Y& P( ]/ K6 k
%end;
" A% K0 P. t7 k9 `# D; J6 t
$ }, a6 E4 V$ E$ G1 `
%let CDS_FlagDataSetExists_&CDS_i.=%SYSFUNC(EXIST(&&CDS_LibName_&CDS_i...&&CDS_DataSet_&CDS_i.));
: P7 n8 j0 S: ]- |# l
%end;
1 |* o! e9 z- m
j! {6 s( c% D5 o# C( H8 w/ d0 \
%let &FlagDataSetExists=&&CDS_FlagDataSetExists_1;
1 z9 B' S6 B% R ]& E. u8 b; |
; N# ]8 F3 B, K: t
%do CDS_j=2 %to &CDS_DateSet_Num;
0 k C- \% S$ ]' P* C* c( J# F
%let &FlagDataSetExists=&&&FlagDataSetExists.&&CDS_FlagDataSetExists_&CDS_j;
" j- O6 R# X+ @4 s) Q! G. X- O
%end;
- C: c8 E5 K j# W5 c; l Y
%end;
+ V' o4 A+ y# u$ Q6 q/ b: E, f+ N
# k( Q3 T7 ?) f; g9 q; [
/* 如果想要输出结果,请取消下面的注释 */
9 z, \% Q5 j+ S1 q7 `, B7 y( D
/*%put &&&FlagDataSetExists;*/
; V; o7 s3 [( U) |) o% l
2 Y3 ]$ E2 [# U3 v
/* 删除不必要的表格 */
7 ~. S7 M1 g6 Z% z
proc datasets lib=work nolist;
) \% c% a B7 ?" a- u
delete CDS_temp;
( `* T, {0 y% w& q# C
quit;
6 M. a0 s& C- B" |, D' S% h: b& G: S
) J! L3 n2 b5 b8 Z
7 K' v: n& c, _6 f
%exit:
' I8 c$ [9 K" E& Q: C
%mend;
, a6 F+ A, w7 S) l0 o2 r
- w5 [- U6 @4 |: M0 B
! u& x& I# p) V3 P" Y* S. S
%macro Demo();
: ?1 I. S+ Q6 p) E6 ^. D( c# ^
) d$ E" x6 H6 y
%let DataSet=Gfl_fundcodelist_mgrname Gfl_managersoffund; /* 数据集名称,可设为多个,用空格分隔 */
4 k6 ~! C/ y% ^+ t* i" S- a. e( }$ _
%let FlagDataSetExists=FlagDataSetExists1; /* 宏变量的名称,注意不能与参数名称相同*/
* G% S$ [& V+ K
%ChkDataSet(&DataSet,&FlagDataSetExists);
6 \$ c4 u/ M% g( p+ E
8 t! O, g3 U$ \1 o8 ?
%put &FlagDataSetExists1;
+ h- i& s* b% r% u
) G6 T. Q- P# q4 J x, X& S' [
%mend;
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5