SAS中文论坛

标题: 求助一个宏程序。 [打印本页]

作者: shiyiming    时间: 2008-7-30 16:39
标题: 求助一个宏程序。
/******************************************************************************************
请教各位:
问题是这样的:
有两个数据集,一个为原数据集,一个为目标数据集,都为一个变量(字符型),现在想看原始数据集中包含目标数据集的字符串,有则标识c=1。
例如:
原始数据集为aa:变量a的观测有heew zhao niha
目标数据集为bb:变量b的观测有he ao
则结果数据集cc为
a          c
heew    1
zhao     1
niha      .
我写了一个程序,其中用到宏,自己不大会,出错,请各位帮着看看,谢谢
****************************************************************************************/
data aa;
        input a $ @@;
        cards;
        heaa zhao wang
        ;
run;

data bb;
        input b $ @@;
        j+1;
        k=put(j,1.);
        cards;
        an he
        ;
run;

data _null_;
        set bb end=last;
        i+1;
        if last then call symput('total',i);
run;

data _null_;
        set bb;
        call symput('ar'!!k,b);
run;

%put _user_;
       
%macro he;
        %local i ii;
        %do i=1 %to &total;
                data cc;
                        set aa;
                        if index(a,symget('ar'!!&ii)) then  nnn=symget('ar'!!&ii);
                run;
        %end;
%mend;
%he
作者: shiyiming    时间: 2008-7-31 12:28
标题: Re: 求助一个宏程序。
没看明白你写的,那个ii是什么?定义的i你也没用到,我看你的意思好像是将b表中的变量放到一些宏变量中,然后读取a表,判断a表中的每一个变量是不是出现了那些宏变量中的字符,你可以这样实现
proc sql noprint;
select b into : var separated by '|' from b;
run;
然后在你写的宏中,用%scan函数,以 | 为分割符,依次读取宏变量var中的字符,然后在用index去判断这个字符是不是在表a、中的变量中出现。
我记得论坛看到过类似的贴子,你不妨找找看。
作者: shiyiming    时间: 2008-8-1 08:55
标题: Re: 求助一个宏程序。
谢谢的回复.
你说的接下来是不是这样
%macro aa;
   %local i;
   %do i=1 %to 3;
      %let varr=%sysfunc(scan(&var,&i),'|');
      data aa;
         set aa;
         if index(a,&varr)>0 then c=↕
      run;
   %end;
%mend;
可是好像还是行不通,
谢谢!
作者: shiyiming    时间: 2008-8-1 15:13
标题: Re: 求助一个宏程序。
主要是你写的有些地方语法不对。。。
%macro search;
%let i=1;
data result;
set aa;
%do %while(%scan(&var,&i,'|') ne );
%let str=%scan(&var,&i,'|');
if index(name,"&str") gt 0 then do;
c="&str";
output;
end;
%let i=%eval(&i+1);
%end;
run;
%mend;
%search;




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