QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1453|回复: 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,分别表示该数据集是否存在+ v# a7 w0 I/ E
    这个宏用于在其他宏中保持robust用的,如果不先确定下数据集是否存在,到时候SAS在log窗口报的错可不是那么好懂8 T8 u' O- ~. C% [6 @: [7 i

    8 ]! X  w' m! O! h$ Z% Z: o, n1 {另外,如果有更好的解决我写的宏的方法,欢迎指教# L& }& z5 n$ H" C$ }) e% X6 Y% Z6 o
    话说我很久之前吭哧吭哧写的一个标准化的宏,后来才发现有proc stdize
    ( a, V2 }5 X* h1 F所以大家还要多多交流0 I# [5 e# [2 t7 [

    5 W. v7 |6 B! Q% }1 W! e2 H7 Q%macro ChkDataSet(DataSet,FlagDataSetExists);
    * n' w8 n/ @' y/ J- d/ J9 O. V. }4 _9 X
    /**********************************************************************/- y1 H8 ~5 Q/ _2 b- G  ]6 Q
    /* 此宏用于检查指定的数据集是否存在。其中,DataSet是指定的数据集,若 */
    " X; \9 V; W& t9 E+ l/* 需要指定具体的逻辑库,则采用逻辑库.数据库的格式,可设多个数据集, */) f% S8 J. c5 h: I# [
    /* 用空格分隔;FlagDataSetExists是标记宏变量名称,=1表示数据集存在, */
    " P1 f/ Y" b% x0 U! ^9 a( s, t/* 否则=No,若指定了多个数据集,则不同位置上的1或0代表相应的数据集是 */
    - s: _: q8 ^. g6 b0 r8 g/* 否存在。另外需要注意,第一,当仅指定一个数据集时,若不指定逻辑库名 */
    ; M4 K) f: D. J6 q8 h/* 称,而只指定数据集名称,此时若在SAS环境中只包含一个指定的数据集, */+ n& o6 z0 `& y8 {) R2 l% ?9 F
    /* 则标记宏变量FlagDataSetExists=1,若包含多个同名的数据集,则会报错;*/
    7 E. r# c) y$ q0 x) |2 P/* 第二,当指定多个数据集时,若不指定逻辑库名称,则默认为WORK逻辑库。 */
    7 u9 e9 {6 u$ j: i$ [+ W/ J/* */
    ; [" u; w; t! Z# v% e9 Z4 ?/* 最终得到的是宏变量&FlagDataSetExists,若指定数据集存在,则有 */
    ' |, Y! ~% w7 _/* &FlagDataSetExists=1,否则=0,若为多个数据集,则不同位置上的1或0代 */
    3 ]( d+ V% u7 |6 `5 {# `/* 表相应的数据集是否存在。 */
    * x0 H* _# @6 s! I& U) r/* */
    2 @/ J  A+ g1 C. z7 ]/* Created on 2012.11.16 */8 F% r' o8 B1 i- x6 G/ y% E
    /* Modified on 2012.11.16 */$ F; e/ x/ \8 M" T+ Z( D" a; x/ x
    /**********************************************************************/
    " M$ W9 x3 d# ^2 f* `) X4 G2 {- {$ @4 N4 M. K
    /* 检查DataSet的存在性 */2 {$ E+ ]3 |9 N$ X( m
    %if &DataSet EQ %STR( ) %then %do;0 _3 U. t1 }: }1 G* |8 Q6 L6 f. O
    %put ERROR: The DataSet should not be blank, please check it again.;, o" ^. ~7 u2 X1 o/ m* g  m: M5 A
    %goto exit;9 a4 `7 D  r6 K, M4 J
    %end;9 t& [2 O* Y) V2 E' V$ c$ ]" q

    ) T: P* w0 q5 _& D3 i5 w1 N/* 开始进行计算 */
    / h& j- ]1 l# z4 b) W% t7 Z9 H%global &FlagDataSetExists;7 ^4 }" F' `2 H' Y) f* ~* }( k
    2 y. D0 I2 m( T  s
    /* 情形一:仅设定一个数据集,此时若省略逻辑库名,则在所有逻辑库中查找同名的数据集并予以报告 */
    # d; w7 `" V9 y, S& c% D2 M%if %SYSFUNC(FIND(&DataSet,%STR( ))) EQ 0 %then %do;8 F) t+ Y1 `# F& o. L: ], {0 l4 _
    /* 检查DataSet的合法性 */
    ; Y$ j/ W6 }  u6 Z9 q3 s%if %SYSFUNC(FIND(&DataSet,.)) NE 0 %then %do;
    * Q& @7 }/ b6 M" S$ X1 K* _%let CDS_LibName=%UPCASE(%SCAN(&DataSet,1,.));
    * ^0 w7 C. d6 y2 `) a, n  }%let CDS_DataSet=%UPCASE(%SCAN(&DataSet,2,.));
    5 Q. X# W: X! @9 ^' }% \%end;; Y  d; W" ?) Z' W
    %else %do;9 H- ~; o' K# Z9 r3 ~3 }- d
    %let CDS_LibName=%STR();
    + S: l. x! E- F, j6 X- A7 M- V%let CDS_DataSet=%UPCASE(&DataSet);2 X+ h3 s) h' y5 a; C
    %end;# d' m& k8 T  a2 S$ T# Q; G1 H* H

    8 {9 i* h2 ]. M. D4 }9 q& q$ E%if &CDS_DataSet EQ %STR() %then %do;' h! B( g. O" w5 \% |
    %put ERROR: The DataSet should not be blank, please check it again.;& y/ m( M2 ~; o: G  {
    %goto exit;0 S: Q) q0 m2 ~4 d6 X
    %end;$ j: [9 G" H2 D1 I8 u4 r
    %else %if &CDS_LibName NE %STR() %then %do;: U4 z/ r9 J! t
    %let &FlagDataSetExists=%SYSFUNC(EXIST(&CDS_LibName..&CDS_DataSet.));
    ) d* s' m+ X$ R. D3 `2 c%end;
    ( [. Y1 q; V* \& W) }- K6 D%else %do;! U' s* `# }  ]% L# [, x2 ]
    proc sql noprint;
    . J' H! ]8 }% }; y2 D& [create table CDS_temp as: q4 a) |. f, T& M; ]$ Y
    select * from sashelp.vtable+ x' A% z% r) i  l% A
    where memname="&CDS_DataSet";
    + O9 g4 K$ \, E4 cquit;
    3 x  d/ r' S; G6 }4 a3 P7 w
    ! v. v0 s+ g0 B$ ]% G- l- dproc sql noprint;  s1 _# s' i& \2 j: f
    select count(*) into :CDS_DataSetNum from CDS_temp;: [4 J1 q  z; v( v) {
    quit;% Q( q% z; v( W

    ; V# Z9 \4 R; g4 Q%if &CDS_DataSetNum EQ 0 %then %let &FlagDataSetExists=0;" P" r' C4 k$ A+ L! M
    %else %if &CDS_DataSetNum EQ 1 %then %let &FlagDataSetExists=1;
    $ r; b5 R( |: |4 j%else %do;
    7 _  ^, s/ B7 v  E4 l) {%put ERROR: There could be more than one DataSets with the same name appointed in different libraries, please reassign a LibName first.;6 V7 ~& T- X' C
    %goto exit;% P9 i# y- r/ g2 w
    %end;
    4 \8 Z9 k9 z" a5 l% i7 x%end;
    " _7 y) L0 U; F9 _3 }%end;7 Z8 j! l! j+ Q* ]; j- C
    /* 情形二:设定多个数据集,此时若省略逻辑库名,则默认为WORK逻辑库 */  b9 l% H/ d! H4 ]$ \% D& ]0 @
    %else %do;
    ; B0 v0 O& ]2 M9 M- a* v%SeparateString(InputString=&DataSet,OutputString=CDS_DateSet);
    4 M7 B( R3 h# K( H  [+ n, O$ G4 X! a4 U1 h
    %do CDS_i=1 %to &CDS_DateSet_Num;) I+ e1 \+ ]4 s8 H# Y
    /* 检查DataSet的合法性 */
    , D4 H( t- S- K3 q6 _%if %SYSFUNC(FIND(&&CDS_DateSet_Var&CDS_i,.)) NE 0 %then %do;
    9 {+ K8 _) ~4 [" }%let CDS_LibName_&CDS_i.=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,1,.));
    3 R% c6 R4 d: L7 v* A  D%let CDS_DataSet_&CDS_i=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,2,.));, ], o. {) ^  M2 t# D, |3 D& H
    %end;
    # L" I' E6 T9 A  Z- v2 N%else %do;
    & t/ e0 v$ q' U* j+ @3 H% r, s+ J%let CDS_LibName_&CDS_i.=WORK;
    4 f+ V5 k5 \" g: [) v%let CDS_DataSet_&CDS_i.=%UPCASE(&&CDS_DateSet_Var&CDS_i);& x) A6 u% J, ~7 a
    %end;" W' p/ b( t( z' g' C, D6 N

    5 b4 o$ {$ v- K  e8 R%let CDS_FlagDataSetExists_&CDS_i.=%SYSFUNC(EXIST(&&CDS_LibName_&CDS_i...&&CDS_DataSet_&CDS_i.));/ J" v( d" H% K
    %end;
    3 |% q4 m% E+ V' G' L: F! c% Q4 [' N9 Y, ?( v/ C
    %let &FlagDataSetExists=&&CDS_FlagDataSetExists_1;
    . ?8 I4 }3 A: u8 I0 V
    2 J5 m# C3 w0 W5 v  B; m%do CDS_j=2 %to &CDS_DateSet_Num;0 i! a. I, O) q. O
    %let &FlagDataSetExists=&&&FlagDataSetExists.&&CDS_FlagDataSetExists_&CDS_j;* H8 f+ {$ @; j- h
    %end;
    7 B; b0 B# ^8 d%end;
    7 ?! ?0 h& V% A% \$ S( ]8 m
    6 v+ t, u1 A. L, a  T0 n; }" n/* 如果想要输出结果,请取消下面的注释 */
    : k4 o+ M2 l7 z" t7 [% M8 G/*%put &&&FlagDataSetExists;*/# C8 ?' W# R( p' H) T+ C( `6 d% P

    ( ]! x9 N- C! Y4 \6 }. @# H9 H/* 删除不必要的表格 */, o1 K/ n! G1 d3 }
    proc datasets lib=work nolist;
    3 k& {( {# [/ ddelete CDS_temp;
      V! P1 A+ B1 t, Tquit;
    9 H$ u2 `2 z9 O7 M5 n$ M# X& Q; O4 h9 L4 c( o0 L& \
    : q7 D0 W, \' g
    %exit:
    ( r9 P: A2 |$ S%mend;
    : ?" V  }" \( ~  p  F9 \
    , f, {; Q# Y1 g$ e$ _; |7 Y( l
    %macro Demo();" p, D/ U& f$ A% k. |8 s

    & n0 B7 \2 |# W4 u, D%let DataSet=Gfl_fundcodelist_mgrname Gfl_managersoffund; /* 数据集名称,可设为多个,用空格分隔 */% j1 L( @* a( |3 h8 S6 w
    %let FlagDataSetExists=FlagDataSetExists1; /* 宏变量的名称,注意不能与参数名称相同*/
    ' ]- @+ A7 j; T$ Z, g$ G8 Q# K7 ^%ChkDataSet(&DataSet,&FlagDataSetExists);0 D# N! a' n# l
    - A6 @" l4 B- \, Z! n" _
    %put &FlagDataSetExists1;' o4 j8 w0 X7 K9 I( r  g- y

    9 }. k% l8 G2 x2 N' C%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, 2025-6-14 16:08 , Processed in 0.468300 second(s), 51 queries .

    回顶部