数学建模社区-数学中国
标题:
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 stdize
8 {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 I
create table CDS_temp as
' O* Z4 Q- V4 {3 T. E8 f& }
select * from sashelp.vtable
- o; F* Q7 v6 I ^% b& i
where memname="&CDS_DataSet";
( O% x' q& P) ]1 M4 @
quit;
0 D# k1 E) U0 X
7 @3 E4 E8 a0 Y" v
proc 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) Q
2 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