SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1968|回复: 12
打印 上一主题 下一主题

求助宏变量中如何去除重复的

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-10-19 16:45:29 | 只看该作者

求助宏变量中如何去除重复的

%let aaa=a b c a c d f;
如何去除重复的,得到a b c d f!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-10-19 23:58:24 | 只看该作者

Re: 求助宏变量中如何去除重复的

[code:138d25jz]%let aaa=a b c a c d f a d d f;
%macro nodup(var);
%local i temp;
%let i=1;
%let temp=%scan(&&&var,&i);
%do %while(&temp ne);
        %let &var=&temp %sysfunc(tranwrd(&&&var,&temp,));
        %let i=%eval(&i+1);
        %let temp=%scan(&&&var,&i);
%end;
%let &var=%sysfunc(reverse(&&&var));
%mend;

%nodup(aaa);

%put &aaa;[/code:138d25jz]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-10-20 01:50:13 | 只看该作者

Re: 求助宏变量中如何去除重复的

[code:3mzh4916]%let aaa=a b c a c d f d d1;
%macro removeMcr;
   %local f1 f2 aaa1 aa;
        %let f1 =;        %let aaa1 =&aaa; %let i =1;
        %do%while(%scan(&aaa, &i) ^=%str( ));
                %let f =%scan(&aaa, &i);
                %let f1 =&f1 &f; %let aa =; %let j =1;
                %do%while(%scan(&aaa1, &j) ^=%str( ));
                        %let f2 =%scan(&aaa1, &j);
                        %if  &f2 =&f  %then %let f2=;
                        %let aa =&aa &f2; %let j =%eval(&j+1);
                %end;
                %let aaa1 =&aa; %let aaa =&f1 &aaa1; %let i =%eval(&i+1);
                %put **&i **f=&f  **f1=&f1 **aaa1=&aaa1 **aaa=&aaa;
        %end;
%Mend removeMcr;

%removeMcr
;
%put &aaa
;
[/code:3mzh4916]
不知道为什么tranwrd在macro里改变功能?所以只好用循环去替代
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-10-20 09:54:13 | 只看该作者

Re: 求助宏变量中如何去除重复的

[code:3ok8u4pd]%macro nodup(var);
    data temp;
        do i=1 to length(compbl("&var"))-Length(compress("&var"))+1 ;
        word=put(scan("&var",i), $10.);
        output;
        end;
     run;
     proc sql;
        select distinct word into :var separated by ' '
        from temp;
    %put var=&var;
%mend;

%nodup(a b c a c d f a d d f);[/code:3ok8u4pd]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-10-20 10:28:35 | 只看该作者

Re: 求助宏变量中如何去除重复的

谢谢jingju11的建议,tranwrd 很难用。。。想办法用上去了。。。还是ahuige的思想厉害。。。
[code:2nplq44m]%let aaa=a b c a c d f a d d f1 a _F1 abc;
%macro nodup(var);
%local temp left;
%let temp=%scan(&&&var,1);
%let left=%sysfunc(tranwrd(&&&var,%str( ),%str(  )));
%let &var=;
%do %until(&temp eq );
        %let left=%sysfunc(tranwrd(%str( )&left%str( ),%str( )&temp%str( ),%str( )));
        %let &var=&&&var &temp ;
        %let temp=%scan(&left,1);
%end;
%mend;

%nodup(aaa);

%put &aaa; [/code:2nplq44m]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-10-20 20:35:08 | 只看该作者

Re: 求助宏变量中如何去除重复的

to Ahuige:
运行 %nodup(a c b c a c d f a d d f);
结果仍然是a b c d e f,也就是sql 对结果排序。如何保留 a c b d e f 呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-10-20 22:28:31 | 只看该作者

Re: 求助宏变量中如何去除重复的

[code:3850i3n8]%macro nodup(var);
    data temp;
        do i=1 to length(compbl("&var"))-Length(compress("&var"))+1 ;
        word=put(scan("&var",i), $10.);
        output;
        end;
     run;
     proc sql;
        select word into :var separated by ' '
        from temp
        group by word
        having i=min(i)
        order by i;
    %put var=&var;
%mend;

%nodup(a c b c a c d f a d d f);[/code:3850i3n8]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-10-20 22:44:12 | 只看该作者

Re: 求助宏变量中如何去除重复的

还需要保持原顺序啊 <!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: -->
试试这样行么...
[code:2fl66mq2]%let aaa=a c a b c   d f;
%macro nodup(&amp;aaa);
data aa;
  do i=1 to count(&quot;&amp;aaa&quot;,&quot; &quot;)+1;
    i=i;
    x=scan(&quot;&amp;aaa&quot;,i,&quot; &quot;);
    output;
  end;
run;
proc sort nodupkey;
  by x;
run;
proc sort;
  by i;
run;
data _null_;
  set aa end=last;
  retain xx;
  format xx $250&#46;;
  xx=compbl(xx||&quot; &quot;||x);
  if last then call symput(&quot;var&quot;,xx);
run;
%mend;
%put &amp;var;[/code:2fl66mq2]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-10-21 07:06:34 | 只看该作者

Re: 求助宏变量中如何去除重复的

[code:6yrru0qn]%macro nodup(var);
    %let shortvar=;
    %do %while (%scan(&amp;var,1) ne );
    %if ( %index(&amp;shortvar,%str( )%scan(&amp;var,1)%str( ))=0)%then %let shortvar=&amp;shortvar%str( )%scan(&amp;var,1)%str( );
    %if %index(&amp;var,%str( ))&gt;0 %then %let var=%substr(&amp;var,%index(&amp;var,%str( )))%Str( );
    %end;
    %put shortvar=%sysfunc(compbl(&amp;shortvar));
%mend;

%nodup(a c b c a c d f a d d f);[/code:6yrru0qn]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-10-21 12:00:45 | 只看该作者

Re: 求助宏变量中如何去除重复的

%macro distinctlist(list);
  %local dlist i;
  %let dlist=%scan(&amp;list,1,%str( ));
  %let i=2;
  %do %while(%scan(&amp;list,&amp;i,%str( )) ne %str( ));
         %if %sysfunc(indexw(&amp;dlist,%scan(&amp;list,&amp;i,%str( ))))=0 %then %do;
                 %let dlist= &amp;dlist %scan(&amp;list,&amp;i,%str( ));
             %end;
                 %let i=%eval(&amp;i+1);
%end;
%put &amp;dlist;
%mend;
%distinctlist(%str(ab c d e a a ));
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-6 04:32 , Processed in 0.183765 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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