SAS中文论坛

标题: 几种给宏变量赋值的方法 [打印本页]

作者: shiyiming    时间: 2007-10-14 14:29
标题: 几种给宏变量赋值的方法
Macro Variable是我们最常使用的对象,这里给出几种为宏变量赋值的方法。
1、%let mv = 100;   这恐怕是最常使用的了,每位朋友都是用过吧。
2、使用call symput.
[code:3235d]        data _null_;
                x = 100;
                call symput('x', x);
        run;
        /*为某变量的每个值创建一个宏变量*/
        data _null_;
                set sashelp.class;
                suffix=put(_n_,5.);
                call symput(cats('Name',suffix), Name);
        run;
        /*为表的每个值创建一个宏变量*/
        data _null_;
                set sashelp.class;
                suffix=put(_n_,5.);
                array xxx{*} _numeric_;
                do i =1 to dim(xxx);
                        call symput(cats(vname(xxx),suffix),xxx);
                end;
                array yyy{*} $ _character_;
                do i =1 to dim(yyy);
                        call symput(cats(vname(yyy),suffix),yyy);
                end;
        run;[/code:3235d]
3、proc sql中的select into :mv
[code:3235d]        proc sql noprint;
                select count(*) into :NObs
                from sashelp.class;
                select Name into :Name1-:Name%left(&NObs)
                from sashelp.class;
        quit;[/code:3235d]
4、使用call set
[code:3235d]        %macro doit;
        %let id=%sysfunc(open(sashelp.class));
        %let NObs=%sysfunc(attrn(&id,NOBS));
        %syscall set(id);
        %do i=1 %to &NObs;
                %let rc=%sysfunc(fetchobs(&id,&i));
                %put # # # Processing &Height # # #;
        %end;
        %let id=sysfunc(close(&id));
        %mend;[/code:3235d]
call set是我们处理对照表数据最强的武器,不但灵活方便,而且性能上是最优的。
作者: shiyiming    时间: 2007-10-18 18:46
标题: Re: 几种给宏变量赋值的方法
有时间是得好好看看macro了。。。。。 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
作者: shiyiming    时间: 2007-10-19 22:48
标题: Re: 几种给宏变量赋值的方法
谢谢你。希望我以后也可以给大家提供一些有用的资料。
作者: shiyiming    时间: 2011-4-16 23:15
标题: Re: 几种给宏变量赋值的方法
我在想,是macro variables快~,还是temp array

尤其在array需要在多data步间共享的情况~
作者: shiyiming    时间: 2011-4-17 13:08
标题: Re: 几种给宏变量赋值的方法
还可以把给宏变量赋值的方法细分,我看到的细分方法有8种:下面引用下啊,呵呵 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) --> !!
1.  通过[color=#FF4000:mitdrf2n]宏函数[/color:mitdrf2n]创建宏变量
%let dsid=%sysfunc(open(sashelp.class));
%let nvars=%sysfunc(attrn(&amp;dsid,nvars));
%let nobs=%sysfunc(attrn(&amp;dsid,nobs));
%let dsid=%sysfunc(close(&amp;dsid));
%put &amp;nvars.;
%put &amp;nobs.;

2. 通过SQL过程用[color=#FF4000:mitdrf2n]变量值[/color:mitdrf2n]创建一个宏变量
roc sql noprint;
   select distinct sex
   into :list_a separated by ' '
   from sashelp.class;
quit;
%put &amp;list_a.;

3.通过SQL过程创建[color=#FF4040:mitdrf2n]多个宏变量[/color:mitdrf2n]
proc sql noprint;
   select nvar,nobs
   into:nvar , :nobs
   from dictionary.tables
   where libname = 'SASHELP' and memname = 'CLASS';
quit;
%put &amp;nvar.;
%put &amp;nobs.;

4. 通过[color=#FF4000:mitdrf2n]contents和sql[/color:mitdrf2n]过程用[color=#FF4000:mitdrf2n]变量名[/color:mitdrf2n]创建宏变量
proc contents data=sashelp.class out=con_class;
run;
proc sql noprint;
  select name,put(count(name),5.-l)
  into :clist separated by ' ',:charct
  from con_class
  where type=2;
quit;
%put &amp;clist.;
%put &amp;charct.;

5.通过SQL过程用[color=#FF4000:mitdrf2n]宏变量[/color:mitdrf2n]创建宏变量[color=#FF4000:mitdrf2n]列表[/color:mitdrf2n]
proc sql noprint;
  select name
  into :clist1-:clist999
  from dictionary.columns
  where libname = 'SASHELP' and memname = 'CLASS';
quit;
%put &amp;clist1.;
%put &amp;clist2.;

6.通过SQL过程用[color=#FF4000:mitdrf2n]变量值[/color:mitdrf2n]创建宏变量[color=#FF4000:mitdrf2n]列表[/color:mitdrf2n]
proc sql noprint;
   select count(distinct sex)
      into :n
      from sashelp.class;
   select distinct sex
      into :type1 - :type%left(&amp;n)
      from sashelp.class;
quit;
%put &amp;n.;
%put &amp;type1.;

7,8.通过data步接口子程序[color=#FF4000:mitdrf2n]call symputx[/color:mitdrf2n]与[color=#FF4000:mitdrf2n]call symput[/color:mitdrf2n](两者有区别)
data _null_;
set sashelp.class nobs=obs;
call symputx('m1',obs);
call symput('m2',obs);
Stop;
run;
%put &amp;m1.;
%put &amp;m2.;
作者: shiyiming    时间: 2011-4-18 23:16
标题: Re: 几种给宏变量赋值的方法
经典啊,1000shortcut里面都没有找到总结,施主厉害!

收藏并整理在博客上:“给宏变量赋值的几类方法及举例” <!-- m --><a class="postlink" href="http://saslist.net/archives/122">http://saslist.net/archives/122</a><!-- m -->。 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
作者: shiyiming    时间: 2011-4-19 08:37
标题: Re: 几种给宏变量赋值的方法
哪有啊,说的人家真不好意思捏。 <!-- s:oops: --><img src="{SMILIES_PATH}/icon_redface.gif" alt=":oops:" title="Embarassed" /><!-- s:oops: -->
作者: shiyiming    时间: 2011-4-19 11:23
标题: Re: 几种给宏变量赋值的方法
<!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: --> 那是~

-------------
宏变量比temp array 慢9/1000,
本来如果是data步间共享的话,可以接受,总比每次导入导入强,
但是如果do宏的话~~~~后果不堪想象~

如果sas有把array维持在内存的功能就好了~~
作者: shiyiming    时间: 2011-4-19 13:03
标题: Re: 几种给宏变量赋值的方法
[quote=&quot;sxlion&quot;:17y5p0gc]经典啊,1000shortcut里面都没有找到总结,施主厉害!

收藏并整理在博客上:“给宏变量赋值的几类方法及举例” <!-- m --><a class="postlink" href="http://saslist.net/archives/122">http://saslist.net/archives/122</a><!-- m -->。 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->[/quote:17y5p0gc]

为什么要叫别人shiyiming 施主啊? <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
作者: shiyiming    时间: 2011-4-22 13:39
标题: Re: 几种给宏变量赋值的方法
楼主都这么辛苦归纳加举例了,为什么不进一步说明每个语句的意义呢?例如我是新手,我根本就不知道call symput是什么意思。
作者: Qiong    时间: 2011-4-22 13:44
标题: Re: 几种给宏变量赋值的方法
[quote:25pp9gtv]由 CaiBirdCNB » 2011年 4月 22日 周五 1:39 pm

楼主都这么辛苦归纳加举例了,为什么不进一步说明每个语句的意义呢?例如我是新手,我根本就不知道call symput是什么意思。
[/quote:25pp9gtv]

就是,我根本就不知道data/set是什么意思
作者: shiyiming    时间: 2011-4-22 15:35
标题: Re: 几种给宏变量赋值的方法
[quote=&quot;vicky1020&quot;:27qv3yx8]
就是,我根本就不知道data/set是什么意思[/quote:27qv3yx8]

vicky姐太水了...




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2