数学建模社区-数学中国
标题:
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 A
create table CDS_temp as
: ?. l, I' i- i9 E" \* G4 \; c
select * from sashelp.vtable
8 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. [' K
proc 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 x
0 `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, z
proc datasets lib=work nolist;
8 b2 ~3 d' G; u# V0 `2 H7 W0 Y
delete CDS_temp;
" B& U1 ]7 y2 R
quit;
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 w
0 {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