楼主: dxystata
4564 19

[问答] 如何识别macro变量值的位置? [推广有奖]

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-22

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

楼主
dxystata 发表于 2013-12-26 09:16:49 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
%let aaa=3 4 5;
%let bbb=4;
有什么简单的办法得到bbb在aaa中的位置赋值给ccc?
如果bbb为3 其位置为1
           为4 其位置为2
           为5 其位置为3

谢谢!



二维码

扫码加我 拉你入群

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

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

关键词:Macro Mac CRO acr 变量值 如何

本帖被以下文库推荐

沙发
soporaeternus 发表于 2013-12-26 16:52:19
%scan?
已有 1 人评分经验 热心指数 收起 理由
dxystata + 20 + 1 好的意见建议

总评分: 经验 + 20  热心指数 + 1   查看全部评分

Let them be hard, but never unjust

藤椅
Eternal0601 发表于 2013-12-26 22:41:52
%macro test;
%let aaa=3 4 5;
%let bbb=4;
%let indicator=%sysfunc(indexw(&aaa.,&bbb.));
%if %eval( &indicator gt 0) %then %do;
        %let i=%sysfunc(countw(&aaa,%str( )));
        %put &i.;
        %do j=1 %to &i.;
                %if %qscan(&aaa., &j.,%str( ))=&bbb. %then %do; %let ccc=&j.; %put ccc=&ccc.; %end;
        %end;
%end;
%mend test;

%test
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 40 + 1 + 1 好的意见建议

总评分: 经验 + 40  学术水平 + 1  热心指数 + 1   查看全部评分

板凳
Eternal0601 发表于 2013-12-26 22:43:32
Eternal0601 发表于 2013-12-26 22:41
%macro test;
%let aaa=3 4 5;
%let bbb=4;
这里面有比较tricky的地方,如果aaa为3 4 4,bbb为4的话,返回的值是3,而不是2,你自己可以根据需要再改下

报纸
playmore 发表于 2013-12-27 13:12:52
用FIND函数就好了
已有 1 人评分经验 热心指数 收起 理由
dxystata + 40 + 1 好的意见建议

总评分: 经验 + 40  热心指数 + 1   查看全部评分

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

地板
dxystata 发表于 2013-12-27 17:21:59
playmore 发表于 2013-12-27 13:12
用FIND函数就好了
%let aaa=3 4 5;
%let bbb=4;
%put %sysfunc(find(&aaa,&bbb));
结果显示为3,应该为2。


%let aaa=3 44 5;
%let bbb=4;
%put %sysfunc(find(&aaa,&bbb));
结果显示为3,应该为0。

7
webgu 发表于 2013-12-28 09:43:47
%macro findpositon(source, target);
       %let pos=%sysfunc(find( %sysfunc(compress(&source)),&target));
       %put &pos;
%mend;

%findpositon(3 4 5,4 )
%findpositon(3 4 5,5 )
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 50 + 1 + 1 好的意见建议

总评分: 经验 + 50  学术水平 + 1  热心指数 + 1   查看全部评分

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

8
dxystata 发表于 2013-12-28 09:46:13
webgu 发表于 2013-12-28 09:43
%macro findpositon(source, target);
       %let pos=%sysfunc(find( %sysfunc(compress(&source)),&tar ...
%findpositon(3 44 5,4 )
结果不对!

9
yongyitian 发表于 2013-12-28 10:17:37
Try this
  1. %macro GetPosition(aaa,bbb);
  2.   data _null_;
  3.    length a b $20.;
  4.    a = "&aaa";
  5.    b = "&bbb";
  6.    position = 0;
  7.    do i = 1 to countw(a);
  8.    if scan(strip(a), i) = strip(b) then position = i;
  9.    end;
  10.     put a=   b=  position= ;
  11. run;
  12. %mend GetPosition;
  13. %GetPosition(3 4 5, 4)
复制代码
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
dxystata + 40 + 1 + 1 好的意见建议
webgu + 40 + 40 + 1 + 1 + 1 这个是最安全的。

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

10
Eternal0601 发表于 2013-12-28 10:52:55
Eternal0601 发表于 2013-12-26 22:43
这里面有比较tricky的地方,如果aaa为3 4 4,bbb为4的话,返回的值是3,而不是2,你自己可以根据需要再改 ...
%macro test(aaa=,bbb=);
%let indicator=%sysfunc(indexw(&aaa.,&bbb.));
%if %eval( &indicator gt 0) %then %do;
        %let i=%sysfunc(countw(&aaa,%str( )));
        %put &i.;
        %do j=1 %to &i.;
                %if %qscan(&aaa., &j.,%str( ))=&bbb. %then %do; %let ccc=&j.; %put ccc=&ccc.; %goto exit;  %end;
        %end;
%end;
%exit:
%mend test;

%test(aaa=3 4 4,bbb=4)
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
webgu + 40 + 40 + 1 + 1 + 1 Totally MACRO VERSION

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

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 22:42