SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 3545|回复: 11
打印 上一主题 下一主题

几种给宏变量赋值的方法

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2007-10-14 14:29:16 | 只看该作者

几种给宏变量赋值的方法

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是我们处理对照表数据最强的武器,不但灵活方便,而且性能上是最优的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2007-10-18 18:46:05 | 只看该作者

Re: 几种给宏变量赋值的方法

有时间是得好好看看macro了。。。。。 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2007-10-19 22:48:54 | 只看该作者

Re: 几种给宏变量赋值的方法

谢谢你。希望我以后也可以给大家提供一些有用的资料。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-4-16 23:15:54 | 只看该作者

Re: 几种给宏变量赋值的方法

我在想,是macro variables快~,还是temp array

尤其在array需要在多data步间共享的情况~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-4-17 13:08:42 | 只看该作者

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.;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-4-18 23:16:46 | 只看该作者

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:) -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-4-19 08:37:35 | 只看该作者

Re: 几种给宏变量赋值的方法

哪有啊,说的人家真不好意思捏。 <!-- s:oops: --><img src="{SMILIES_PATH}/icon_redface.gif" alt=":oops:" title="Embarassed" /><!-- s:oops: -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2011-4-19 11:23:50 | 只看该作者

Re: 几种给宏变量赋值的方法

<!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: --> 那是~

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

如果sas有把array维持在内存的功能就好了~~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2011-4-19 13:03:01 | 只看该作者

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:) -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2011-4-22 13:39:27 | 只看该作者

Re: 几种给宏变量赋值的方法

楼主都这么辛苦归纳加举例了,为什么不进一步说明每个语句的意义呢?例如我是新手,我根本就不知道call symput是什么意思。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 15:08 , Processed in 0.071430 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表