数学建模社区-数学中国

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

作者: 百年孤独    时间: 2013-7-23 16:12
标题: SAS基础宏之3:ChkDataSet
这个宏就简单了,输入一个或多个数据集,输出1或0,分别表示该数据集是否存在5 [: S. l' z& Z! G$ w# K' L
这个宏用于在其他宏中保持robust用的,如果不先确定下数据集是否存在,到时候SAS在log窗口报的错可不是那么好懂9 z4 \# x8 ]0 b9 g* s& k6 C) b

0 [& m& s0 A- @另外,如果有更好的解决我写的宏的方法,欢迎指教
# U# v) u7 \5 v" q话说我很久之前吭哧吭哧写的一个标准化的宏,后来才发现有proc stdize
; K4 D5 F5 l& {7 C所以大家还要多多交流
9 H' Y. u7 k! H& R
) ?  _4 s2 m1 J%macro ChkDataSet(DataSet,FlagDataSetExists);7 T9 Z- b2 s7 m2 W1 {( F
; b1 o! J* j2 d: v; F6 n
/**********************************************************************/6 u  s2 B4 m0 M" U9 Q. D
/* 此宏用于检查指定的数据集是否存在。其中,DataSet是指定的数据集,若 */5 Z: N, Y, V% Q2 R) ?# }6 q9 V. G
/* 需要指定具体的逻辑库,则采用逻辑库.数据库的格式,可设多个数据集, */3 Q: B+ A) T  v8 o+ u+ ?5 x
/* 用空格分隔;FlagDataSetExists是标记宏变量名称,=1表示数据集存在, */" d$ h4 F; Y" o3 S  Z/ R) L& T
/* 否则=No,若指定了多个数据集,则不同位置上的1或0代表相应的数据集是 */; j( c& Q) {' s, x) Y
/* 否存在。另外需要注意,第一,当仅指定一个数据集时,若不指定逻辑库名 */: p3 f: A% C$ [
/* 称,而只指定数据集名称,此时若在SAS环境中只包含一个指定的数据集, */+ @& q' j6 Y1 U
/* 则标记宏变量FlagDataSetExists=1,若包含多个同名的数据集,则会报错;*/
0 R: z5 _2 \, }' Q7 p! `5 ~/* 第二,当指定多个数据集时,若不指定逻辑库名称,则默认为WORK逻辑库。 */
6 g6 h& _# V/ [/* */7 z: Z9 H4 w" o+ x2 H
/* 最终得到的是宏变量&FlagDataSetExists,若指定数据集存在,则有 */: [) V7 N; ]# [# r" B5 V+ M- D
/* &FlagDataSetExists=1,否则=0,若为多个数据集,则不同位置上的1或0代 */* @/ s5 m1 z! e/ N
/* 表相应的数据集是否存在。 */5 j. s  ^- r% _: }  g
/* */
, `9 f- y4 {5 T$ ?3 y6 K; t/* Created on 2012.11.16 */& U( e! l4 e: B! n
/* Modified on 2012.11.16 */
8 ]% j; C- J# v7 a9 E/**********************************************************************/6 a* E* i* d, z( j
8 ~% O# P3 c; i# d- }* }
/* 检查DataSet的存在性 */$ q) L7 |% v1 L9 s" `7 [- }) j, Q4 R
%if &DataSet EQ %STR( ) %then %do;
* m  G+ ]- j! N* e: d" ?3 b%put ERROR: The DataSet should not be blank, please check it again.;) k% j2 [8 M# @0 `" n/ O
%goto exit;* M6 q2 X) d2 h
%end;2 I+ H4 M1 C$ m$ g. H1 N! y
; d% p% U: o8 B% _5 s
/* 开始进行计算 */
# ?/ N9 y& |- i2 q- \, u! Y) K%global &FlagDataSetExists;8 c" e+ F$ V  A2 l" B% |
( W* J. |1 S- ^: G( ]
/* 情形一:仅设定一个数据集,此时若省略逻辑库名,则在所有逻辑库中查找同名的数据集并予以报告 */6 ?0 g0 T: l5 h$ {. e* D
%if %SYSFUNC(FIND(&DataSet,%STR( ))) EQ 0 %then %do;
! K2 |% f& S- V' e/* 检查DataSet的合法性 */
1 P$ M3 G5 a, R- K5 g$ b" O# X8 Q%if %SYSFUNC(FIND(&DataSet,.)) NE 0 %then %do;: w6 r2 {5 r7 e" v' ^/ b
%let CDS_LibName=%UPCASE(%SCAN(&DataSet,1,.));
4 l8 c) [( j7 `7 j2 N% z$ q%let CDS_DataSet=%UPCASE(%SCAN(&DataSet,2,.));' t+ e- i7 T4 v
%end;* z6 g1 \1 ~3 {7 e9 ^3 B' g2 C' }; F" d- d
%else %do;, K8 T" T: `0 v( ^; O
%let CDS_LibName=%STR();
: N6 W* q' W  k- v! N/ q$ w4 E, F%let CDS_DataSet=%UPCASE(&DataSet);' ]  Q6 H& J) b3 V. O! M
%end;
9 S: T7 r. F+ Z6 c+ G: ]1 M+ }) F
. @  L* K7 e" D  M( K%if &CDS_DataSet EQ %STR() %then %do;# C) _, C3 e. I  _- T& x6 m
%put ERROR: The DataSet should not be blank, please check it again.;& k% E0 s2 n6 k) L- \; [$ g
%goto exit;
2 K9 f" @: s% v" q  g8 M%end;
& T3 j+ y3 R, B/ O%else %if &CDS_LibName NE %STR() %then %do;
7 x& T4 \" }0 c) o: t%let &FlagDataSetExists=%SYSFUNC(EXIST(&CDS_LibName..&CDS_DataSet.));
, X6 e! m. m; ~* O4 ?4 P. {2 n. \  ^3 y%end;- G+ S2 I1 ^: z5 _0 H
%else %do;) W; m* q7 B, U: s
proc sql noprint;
% o" N- l* h2 \( G% q4 Acreate table CDS_temp as
: ?. l, I' i- i9 E" \* G4 \; cselect * from sashelp.vtable8 k; X+ u" z- p' k. g
where memname="&CDS_DataSet";3 M% X! I. V. a2 y7 b, i2 ]. |" y7 C
quit;* S: W! j' r1 k8 d/ v  @3 }+ ?

# ?# e/ `) x; M. [' Kproc sql noprint;
" i# {0 l6 N' V: B9 N5 ~select count(*) into :CDS_DataSetNum from CDS_temp;
$ P5 C6 Y* P4 B# O9 J5 \quit;
& J3 l. u$ Y4 {8 ^/ [; I3 ~8 x0 `4 H, k, T. t$ {
%if &CDS_DataSetNum EQ 0 %then %let &FlagDataSetExists=0;9 g- R! |6 g: Z+ c$ z& x* ~
%else %if &CDS_DataSetNum EQ 1 %then %let &FlagDataSetExists=1;
  W) k) z) N8 E2 I%else %do;9 I" ]0 j+ m. A2 J/ X9 T
%put ERROR: There could be more than one DataSets with the same name appointed in different libraries, please reassign a LibName first.;5 n" N' W* n  [3 g
%goto exit;) n5 h: n+ t+ x# j. s! s. v! M
%end;
# D- p$ t) ]+ Y/ E3 d% ~' S%end;. ?  p# ]7 n2 j
%end;
, b; T3 @# |# q! j/* 情形二:设定多个数据集,此时若省略逻辑库名,则默认为WORK逻辑库 */
" s1 R3 y' w- u1 h1 G! }* m%else %do;
" h, A0 b- Y. y. i1 q. x0 I7 d%SeparateString(InputString=&DataSet,OutputString=CDS_DateSet);" P; R8 C9 z8 Y( G. D# `9 O" g

' X+ g3 i; b4 ^  [6 L# w( M- ]1 `%do CDS_i=1 %to &CDS_DateSet_Num;- F6 o+ [; j+ [9 p3 Z
/* 检查DataSet的合法性 */
' C5 O0 v9 B' k, x& q+ o5 P%if %SYSFUNC(FIND(&&CDS_DateSet_Var&CDS_i,.)) NE 0 %then %do;
" s" m( [  c8 p1 U%let CDS_LibName_&CDS_i.=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,1,.));2 F  d! ~" E6 `" s$ ?8 s
%let CDS_DataSet_&CDS_i=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,2,.));! _7 q0 {! f, I/ }5 t$ c9 ?
%end;
% Z) H# Q' [& |* F6 M2 h: F%else %do;% |" M+ j1 r0 o, A9 Q
%let CDS_LibName_&CDS_i.=WORK;
4 V5 C5 v& r, b%let CDS_DataSet_&CDS_i.=%UPCASE(&&CDS_DateSet_Var&CDS_i);
1 y" r" ~  i. E9 B8 W%end;$ C7 U4 y' O6 }# g2 I

+ W8 _. P( B% N1 _# E%let CDS_FlagDataSetExists_&CDS_i.=%SYSFUNC(EXIST(&&CDS_LibName_&CDS_i...&&CDS_DataSet_&CDS_i.));
+ ^* r1 b3 N1 a$ D( Q% u# Z9 m/ E; X%end;9 u) g) A1 G4 }/ W4 L1 j6 b
, t$ D. C  d0 F0 _; F
%let &FlagDataSetExists=&&CDS_FlagDataSetExists_1;
& f! W9 @: Z9 w( m. l4 B5 m- @
%do CDS_j=2 %to &CDS_DateSet_Num;% e' [) p9 N1 u
%let &FlagDataSetExists=&&&FlagDataSetExists.&&CDS_FlagDataSetExists_&CDS_j;' G( U& i6 J6 J7 V) [9 c% d8 f
%end;
3 l9 U' s! J+ u  u%end;: {& T+ Y: C# I" U

* D2 B2 f# k& [" ]/* 如果想要输出结果,请取消下面的注释 */
1 d$ I- B4 P" v2 y" }4 I/*%put &&&FlagDataSetExists;*/
6 k8 W6 U/ b6 Q, \' |5 o  X9 G0 l( n) X2 |. Y
/* 删除不必要的表格 */
  q& C& t( p' I; N( Y, zproc datasets lib=work nolist;8 b2 ~3 d' G; u# V0 `2 H7 W0 Y
delete CDS_temp;
" B& U1 ]7 y2 Rquit;
4 j/ e1 e0 {, B( ^. ?  m. w: l9 m
; T9 S" @$ C' e+ f2 f; O! l' \. q8 C1 i
%exit:( H# G3 T. @: H4 j6 |* {
%mend;8 z/ d' C9 i& {: s

4 i0 H5 x& k& A2 {' \5 w0 {4 X/ X  K; a
%macro Demo();
# j9 t/ |4 R: o
- D+ K9 x  G' C%let DataSet=Gfl_fundcodelist_mgrname Gfl_managersoffund; /* 数据集名称,可设为多个,用空格分隔 */5 Z# F/ T6 v" z+ V  M0 N& O
%let FlagDataSetExists=FlagDataSetExists1; /* 宏变量的名称,注意不能与参数名称相同*/5 X5 s7 p1 y& T# S# C
%ChkDataSet(&DataSet,&FlagDataSetExists);( I) X, e0 o$ S+ s, D

. `  L+ Q1 R+ _1 {( K+ C%put &FlagDataSetExists1;. o. m4 \5 w( J0 X
2 W& p- o) G, h  ^( V2 n; ?0 d
%mend;




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