QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1723|回复: 0
打印 上一主题 下一主题

SAS基础宏之3:ChkDataSet

[复制链接]
字体大小: 正常 放大

3503

主题

538

听众

5990

积分

  • TA的每日心情
    开心
    2017-2-7 15:12
  • 签到天数: 691 天

    [LV.9]以坛为家II

    社区QQ达人 元老勋章 发帖功臣 新人进步奖 优秀斑竹奖 金点子奖 原创写作奖 最具活力勋章 助人为乐奖 风雨历程奖

    群组2013年国赛赛前培训

    群组2014年地区赛数学建模

    群组数学中国第二期SAS培训

    群组物联网工程师考试

    群组2013年美赛优秀论文解

    跳转到指定楼层
    1#
    发表于 2013-7-23 16:12 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    这个宏就简单了,输入一个或多个数据集,输出1或0,分别表示该数据集是否存在
    , Z7 i6 ]% W' X5 e* E6 ?$ D这个宏用于在其他宏中保持robust用的,如果不先确定下数据集是否存在,到时候SAS在log窗口报的错可不是那么好懂
    ; s& \3 T0 u  t9 V1 t5 G. I0 A& T7 k# i/ }2 V# G. \
    另外,如果有更好的解决我写的宏的方法,欢迎指教7 o& l5 _5 B" D" O/ R/ {; r
    话说我很久之前吭哧吭哧写的一个标准化的宏,后来才发现有proc stdize
    . ~) v; ?7 y- n所以大家还要多多交流- Q3 J; L  B" t$ T8 B+ Z2 @
    & t+ @. u$ T) n4 S& W
    %macro ChkDataSet(DataSet,FlagDataSetExists);
    3 @# R. D! R% W* d( a8 n* T1 O7 d6 G
    /**********************************************************************/
    7 Z# L& j4 \9 z/* 此宏用于检查指定的数据集是否存在。其中,DataSet是指定的数据集,若 */
    4 r; S5 {4 a. d  k3 S. h( }2 r/* 需要指定具体的逻辑库,则采用逻辑库.数据库的格式,可设多个数据集, */
    % s5 C# U# T9 `- d/* 用空格分隔;FlagDataSetExists是标记宏变量名称,=1表示数据集存在, */1 C, }7 H% Y* v3 ~) F2 t1 Z% r8 f
    /* 否则=No,若指定了多个数据集,则不同位置上的1或0代表相应的数据集是 */
    ' r! ~, C! Q2 a( e% w  K8 f  ]/* 否存在。另外需要注意,第一,当仅指定一个数据集时,若不指定逻辑库名 */
    6 L! J% [  r7 N+ G* ^/* 称,而只指定数据集名称,此时若在SAS环境中只包含一个指定的数据集, */
    1 `( b; H: z# |0 \! C/* 则标记宏变量FlagDataSetExists=1,若包含多个同名的数据集,则会报错;*/
    + g& ^" T+ Y9 x5 X4 m" [/* 第二,当指定多个数据集时,若不指定逻辑库名称,则默认为WORK逻辑库。 */
    # ]6 p3 C" `) e' N2 K4 S/* */
    ' q3 b+ y# Q+ h2 m1 T+ x# ^/* 最终得到的是宏变量&FlagDataSetExists,若指定数据集存在,则有 */
    8 o, k8 ?5 h( u7 S9 u* v4 S& s/* &FlagDataSetExists=1,否则=0,若为多个数据集,则不同位置上的1或0代 */0 a  A5 W( h: p1 p9 |
    /* 表相应的数据集是否存在。 */" a: q8 J. s$ {- ?9 Z
    /* */+ t) t' e& \8 j$ {5 ]% E
    /* Created on 2012.11.16 */
    + r7 [: p& \; m6 `% l/* Modified on 2012.11.16 */
    & c9 L9 u+ L6 o/**********************************************************************/
    9 H- g8 {, z6 c% f
    6 F* y, d# n7 u& D- b: X/* 检查DataSet的存在性 */$ \1 n* }0 F' O0 c7 t
    %if &DataSet EQ %STR( ) %then %do;
    7 q+ O% E' ?: A, F6 o# K%put ERROR: The DataSet should not be blank, please check it again.;
    " U2 i  M! u- s%goto exit;
    , T" W( x* I8 U5 r%end;1 V5 R: a. I; G+ j' i
    0 x6 b# O4 r4 A5 T$ Z4 g
    /* 开始进行计算 */3 F, G# w& ^, z) p4 k' C' O5 T4 u
    %global &FlagDataSetExists;
    2 b  A$ b. _0 L2 d! D
    - G1 n1 g' e  R2 \/* 情形一:仅设定一个数据集,此时若省略逻辑库名,则在所有逻辑库中查找同名的数据集并予以报告 */, ]+ x) L. @1 P
    %if %SYSFUNC(FIND(&DataSet,%STR( ))) EQ 0 %then %do;2 M/ R) ?8 U2 j6 V5 R
    /* 检查DataSet的合法性 */
    * e; v0 M  p3 F- n4 i4 n9 `* W%if %SYSFUNC(FIND(&DataSet,.)) NE 0 %then %do;
    * X( O. {! M8 c- Z1 ?%let CDS_LibName=%UPCASE(%SCAN(&DataSet,1,.));% l# q6 w/ f- U1 G* x- J
    %let CDS_DataSet=%UPCASE(%SCAN(&DataSet,2,.));$ u+ e+ ^4 a6 W6 G6 r4 J
    %end;0 N; V9 ]2 e! c
    %else %do;& D% f1 u  O) q$ }, ^  [
    %let CDS_LibName=%STR();
    ! A: d$ O  I4 N0 F%let CDS_DataSet=%UPCASE(&DataSet);
    8 j4 a' {- ~# \7 n1 @% b%end;: a$ `  Z4 a2 e, h8 L: s; G& c2 V

    $ n0 {9 k2 F% W7 T4 e0 s%if &CDS_DataSet EQ %STR() %then %do;6 G+ c5 G5 R( q- [  [  u5 R0 d
    %put ERROR: The DataSet should not be blank, please check it again.;, J( f; d2 a) j& j
    %goto exit;
    & O6 ?2 A$ v+ q5 A5 l%end;, D" S; w6 B# F+ s7 Y6 z! Q( v: _. u
    %else %if &CDS_LibName NE %STR() %then %do;. o: G5 C  s% `  Y: C
    %let &FlagDataSetExists=%SYSFUNC(EXIST(&CDS_LibName..&CDS_DataSet.));
    + h; r9 C% w7 S%end;
    8 L3 E3 w+ a: C- Y, D5 l4 m%else %do;
    + E1 Q' x1 W- a, @proc sql noprint;
    6 ]+ T3 o$ J. u! \6 |create table CDS_temp as* P- M' {' {$ v, J# t( ~) x1 r0 J3 Y1 F9 U
    select * from sashelp.vtable
    # p9 x' Y$ U& D, z( b; W* {5 Vwhere memname="&CDS_DataSet";
    9 l5 [: G* z+ |4 p% I+ x% \quit;) `& N, a% L- H. L

    ! T' K! o3 m0 ], q. j# d  t1 [( e9 Tproc sql noprint;6 J! t3 a# K: W/ _
    select count(*) into :CDS_DataSetNum from CDS_temp;/ E  P* B- {8 K+ \) Z+ D. R
    quit;
    ( X4 A; }( G* M) h0 B+ M9 r
    7 V/ R1 c: A6 @/ D( ], D% I6 y%if &CDS_DataSetNum EQ 0 %then %let &FlagDataSetExists=0;8 z! n0 D" n! ?4 x3 f' ^
    %else %if &CDS_DataSetNum EQ 1 %then %let &FlagDataSetExists=1;
    , V9 N  m8 M8 V8 Q6 e2 Y%else %do;
    & O5 X) P7 O) z4 H9 r0 I%put ERROR: There could be more than one DataSets with the same name appointed in different libraries, please reassign a LibName first.;
    + C+ W+ e5 Z7 m: D. i2 ^%goto exit;
      B5 _( f( O3 }; U%end;: W: Z7 Q  w2 R( X& V  h
    %end;
    9 O1 s/ K2 z% O% _4 G%end;; n% M4 A" V2 G$ y
    /* 情形二:设定多个数据集,此时若省略逻辑库名,则默认为WORK逻辑库 */4 k( h. l- F  `/ b% U- \
    %else %do;
    3 q7 @$ x' d* _; f%SeparateString(InputString=&DataSet,OutputString=CDS_DateSet);* K+ j  z# y& b3 Q- o0 W

    * @7 N. J5 F" P% K3 v& j%do CDS_i=1 %to &CDS_DateSet_Num;6 Z) j8 {; U  z5 v9 U( V3 G
    /* 检查DataSet的合法性 */, G: M+ b1 r2 Q) v' a
    %if %SYSFUNC(FIND(&&CDS_DateSet_Var&CDS_i,.)) NE 0 %then %do;0 u+ u; r  _8 I
    %let CDS_LibName_&CDS_i.=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,1,.));7 u( c: h( S, y8 @4 o. ^
    %let CDS_DataSet_&CDS_i=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,2,.));; y, c3 S9 g; f8 r9 H) Z! A
    %end;
    # `6 O, Q. B' b/ J& i+ o  y%else %do;. E% t" d3 f5 V4 Y7 G
    %let CDS_LibName_&CDS_i.=WORK;2 q* J( K# z0 e. h, B$ X
    %let CDS_DataSet_&CDS_i.=%UPCASE(&&CDS_DateSet_Var&CDS_i);8 X5 {7 V3 z5 Q& s
    %end;* K0 T" k% Z: o( S; C% L

    0 P: |$ w& A+ ]" g%let CDS_FlagDataSetExists_&CDS_i.=%SYSFUNC(EXIST(&&CDS_LibName_&CDS_i...&&CDS_DataSet_&CDS_i.));# z0 p9 q% z. q1 Q; N  F! _# i
    %end;
    & ~/ K3 k. ?  J0 v& V( Y2 M, O( F
    %let &FlagDataSetExists=&&CDS_FlagDataSetExists_1;  A' a9 s9 ^3 i8 j) `; x0 ]2 F& w- w

    : w# Y) w$ T% B) f: s; f7 m%do CDS_j=2 %to &CDS_DateSet_Num;  |/ Z7 X$ a0 i0 j7 a7 I
    %let &FlagDataSetExists=&&&FlagDataSetExists.&&CDS_FlagDataSetExists_&CDS_j;" k$ W2 D; i# K8 E6 `7 n2 n
    %end;
    # L: p$ U$ M$ h6 L2 L  F7 @/ N%end;
    " e! n; U5 ^5 w. Y6 @
    8 V( b( r( h/ u+ E! G/ k% J# R# _4 f/* 如果想要输出结果,请取消下面的注释 */% X: o* m6 _3 Q+ m6 i
    /*%put &&&FlagDataSetExists;*/% X: j1 h8 W& U1 [4 V+ r
    7 O8 H2 M" W" F9 Z
    /* 删除不必要的表格 */6 H- \: C* |! T3 U5 t
    proc datasets lib=work nolist;) N7 ^! c  v7 l' V2 |( Q! G' D
    delete CDS_temp;! e4 a; P; V2 ^9 n
    quit;
    7 }0 w6 d3 ], J2 [/ R5 Z7 h( e
    3 u2 \: s6 Z9 I( l# F
    $ K% ?0 W9 }4 W( y%exit:9 h( h6 p& C5 V) l$ q& A
    %mend;0 h. w0 z1 o. X0 b9 l! Y

    / X* ?: y; W2 [5 h& Z, V
    9 [3 N& z6 B' {%macro Demo();
    2 s9 F3 l9 ?! U) Z! I* o& w, Q& p/ Z# i0 [4 q) X
    %let DataSet=Gfl_fundcodelist_mgrname Gfl_managersoffund; /* 数据集名称,可设为多个,用空格分隔 */
    8 k2 E% W, P& ?1 E. d" {) l+ Q%let FlagDataSetExists=FlagDataSetExists1; /* 宏变量的名称,注意不能与参数名称相同*/
    - H5 k* I2 z, f7 `! U# @3 f" [%ChkDataSet(&DataSet,&FlagDataSetExists);3 j* K5 e" f8 d  Z0 k) _( n

    5 I7 q1 J/ ?+ k+ k%put &FlagDataSetExists1;
    : }% Y& e; w/ g' P9 C) ~- }" m
    $ _5 z1 K, P5 L" f! g6 f%mend;
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-11 01:51 , Processed in 0.275682 second(s), 52 queries .

    回顶部