楼主: Imasasor
4416 7

[学习分享] 总结了一下,如何将一个宏变量前后倒置。 [推广有奖]

  • 1关注
  • 64粉丝

VIP

已卖:215份资源

学科带头人

33%

还不是VIP/贵宾

-

TA的文库  其他...

超哥喜欢的文章

威望
1
论坛币
47033 个
通用积分
3.1376
学术水平
238 点
热心指数
246 点
信用等级
231 点
经验
37132 点
帖子
849
精华
3
在线时间
2235 小时
注册时间
2012-7-4
最后登录
2024-10-10

初级学术勋章 初级热心勋章 初级信用勋章 中级热心勋章 中级学术勋章

楼主
Imasasor 发表于 2013-2-23 15:25:58 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
前两天问了个问题:https://bbs.pinggu.org/thread-2221015-1-1.html

%let a=you are how;
怎么生成宏变量b变成 how are you
求助...........

一个很简单的问题,各位朋友给出了很多不同的做法,我认真地学习了一下,也借此给各位分享一下
/*方案1:很简单*/
%macro inverse(a=);
%let i=1;
%let var=1;
%let b=;
%do %while(&var^=);
%let var=%scan(&a,&i);
%let b=&var &b;
%let i=%eval(&i+1);
%end;
%put &b;
%mend;
%inverse(a=sir you are how )
/*方案2:scan函数从后面截取*/
%macro inverse2(a=);
%let i=-1;
%let var=1;
%let b=;
%do %while(&var^=);
%let var=%scan(&a,&i);
%let b=&b &var;
%let i=%eval(&i-1);
%end;
%put &b;
%mend;
%inverse2(a=sir you are how)

/*方案3:利用data步,从最后一位依次读入,然后再生成宏变量*/
data a;
%let a=sir you are how;
i=-1;
var="whatever";
do until(var="");
var=scan("&a",i);
output;
i+(-1);
end;
run;
proc sql noprint;
select var into:b separated by " " from a;
quit;
%put &b;

/*方案4:先对整个宏变量倒置,再对倒置后宏变量内的每个单词倒置 playmore贡献*/
options symbolgen=no;
%macro ReverseString(a=);
%let a_temp=%SYSFUNC(REVERSE(&a));
%let b=;
%do i=1 %to %EVAL(%SYSFUNC(COUNT(&a,%STR( )))+1); /*第一次知道,数空格个数可以这样数%str(),看了bobguy的代码,发现这里有缺陷,count寻找substring,如果原变量不同单词以多个空格隔开,就会出现计数错误,用%cmpres可以将多个空格变成一个,并删除头尾空格*/
%let b=&b %SYSFUNC(REVERSE(%SCAN(&a_Temp,&i)));
%end;
%put &b;
%mend;
%ReverseString(a=sir you are how);

/*方案5:还是利用data步,countw可以直接计算有多少单词,Bridgenc贡献*/
data b;
%let a=sir you are how;
format d $100.;
k=countw("&a");
do i=1 to k;
   c=scan("&a",-i," ");
   d=catx(" ",d,c);
end;
call symput ("b",d);
run;
%put &b;

/*方案6: %cmpres Compress multiple blanks and remove leading and trailing blanks。  bobguy贡献*/
%macro inverse(varlist=);
%let n= %eval(%sysfunc(countc(%cmpres(&varlist),%str( )))+ (%length(&varlist) gt 0) );
%let name1=;
%do i=&n %to 1 %by -1;
        %let name1=&name1 %scan(&varlist,&i) ;
%end;
%put &name1;
%mend;
%inverse(varlist=you are how)

/*总结一下:做循环,很多时候计算循环次数,就要看有多少单词,其中countw最直接最好用,countc,count如果有多个分隔符要小心。用do while, do until 不需要知道循环的次数,是一个简单的方法。*/
/*scan函数可以从右边读取单词,把i 设置成负数就可以了。*/
/*%sysfunc*/
/*reverse*/
/*%cmpres*/
/*%str( );*/ 

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:substring Whatever proc sql Multiple separate 如何

已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
webgu + 60 + 60 + 3 + 3 + 3 精彩帖子

总评分: 经验 + 60  论坛币 + 60  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

本帖被以下文库推荐

欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

沙发
webgu 发表于 2013-2-23 16:19:59
可以结合一下。

%macro inverse(varlist=);
%let n= %sysfunc(countw(&varlist));
%let name1=;
%do i=&n %to 1 %by -1;
        %let name1=&name1 %scan(&varlist,&i) ;
%end;
%put &name1;
%mend;
%inverse(varlist=you are how)
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
可~乐 + 1 + 1 + 1 简洁,明朗
playmore + 1 + 1 + 1 我觉得这是最好的办法了

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

藤椅
hamsik11 发表于 2013-2-23 17:12:17
webgu 发表于 2013-2-23 16:19
可以结合一下。

%macro inverse(varlist=);
顶一下这个

板凳
goldbaodi 发表于 2013-3-24 11:21:42
webgu 发表于 2013-2-23 16:19
可以结合一下。

%macro inverse(varlist=);
顶一下这个

报纸
gaotao0727 发表于 2013-3-25 10:47:05
好好~~
衣带渐宽终不悔,为伊消得人憔悴~~

地板
hs4601 发表于 2013-12-15 17:13:12

7
_东东♂ 发表于 2013-12-16 23:45:58
怎么都这么牛逼。。。

8
liu5355776 发表于 2014-3-1 08:31:22
thanks

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 00:41