楼主: shenliang_111
1826 6

[原创博文] 一个宏的改进 [推广有奖]

  • 3关注
  • 12粉丝

教授

15%

还不是VIP/贵宾

-

威望
0
论坛币
14 个
通用积分
0.4174
学术水平
20 点
热心指数
26 点
信用等级
12 点
经验
17989 点
帖子
478
精华
0
在线时间
1627 小时
注册时间
2011-2-24
最后登录
2025-8-3

楼主
shenliang_111 发表于 2011-7-14 21:55:18 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
该宏是用来比较任意两个数据集变量是否相等,dsn1表示基数据集,dsn2表示测试数据集,我想问问各位好朋友们,宏当中如何提前结束子循环(如红色部分所示),本人用until,但是显示是错误的,我们知道DATA步中用leave就可以提前结束,那宏中呢?谢谢了


%macro sssss(dsn1,dsn2);
proc sql noprint;
select name into :namelist separated by ' '
from dictionary.columns
where libname='WORK' and memname=upcase("&dsn1");
%let dim1=&sqlobs;
select name into :namelist2 separated by ' '
from dictionary.columns
where libname='WORK' and memname=upcase("&dsn2");
%let dim2=&sqlobs;
quit;
%put namelist=&namelist  namelist2=&namelist2 &dim1 &dim2;
%do i=1 %to &dim2;
%let count=0;
%let word2=%scan(&namelist2,&i);
    %do j=1 %to &dim1 %until(&count=1);;
%let word1=%scan(&namelist,&j);
    %if &word2=&word1   %then %do;
    %put variable &word2 is  in &dsn1;
%let count=%eval(&count+1);
%end;
%end;
%if &count=0  %then %put variable &word2 is not in &dsn1;
%end;
%mend sssss;
二维码

扫码加我 拉你入群

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

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

关键词:Dictionary Variable separate proc sql libname

沙发
honghejing 发表于 2011-7-14 22:07:08
j=1 %to &dim1 去掉试试

藤椅
shenliang_111 发表于 2011-7-14 22:23:35
2# honghejing
去掉之后,我后面的scan函数就用不了了哦...

板凳
pobel 在职认证  发表于 2011-7-15 07:22:37
试试这个:

%do j=1 %to &dim1;
      %let word1=%scan(&namelist,&j);
      %if &word2=&word1   %then %do;
                        %put variable &word2 is  in &dsn1;
                         %let count=%eval(&count+1);
                         %let j=%eval(&dim1+1);
       %end;
%end;
已有 2 人评分经验 论坛币 学术水平 热心指数 收起 理由
crackman + 60 + 1 鼓励积极发帖讨论
liuzhenzhu + 100 + 2 热心帮助其他会员

总评分: 经验 + 60  论坛币 + 100  学术水平 + 2  热心指数 + 1   查看全部评分

和谐拯救危机

报纸
honghejing 发表于 2011-7-15 08:56:26
%let j=1;
  %do %until(&count=1 or &j=&dim1);;
%let &j=%eval(&j)+1;
%let word1=%scan(&namelist,&j);
    %if &word2=&word1   %then %do;
    %put variable &word2 is  in &dsn1;
%let count=%eval(&count+1);
%end;

地板
shenliang_111 发表于 2011-7-15 09:28:42
4# pobel
没想到....嘻嘻...还是您厉害...

7
bobguy 发表于 2011-7-15 09:59:59
shenliang_111 发表于 2011-7-14 21:55
该宏是用来比较任意两个数据集变量是否相等,dsn1表示基数据集,dsn2表示测试数据集,我想问问各位好朋友们,宏当中如何提前结束子循环(如红色部分所示),本人用until,但是显示是错误的,我们知道DATA步中用leave就可以提前结束,那宏中呢?谢谢了


%macro sssss(dsn1,dsn2);
proc sql noprint;
select name into :namelist separated by ' '
from dictionary.columns
where libname='WORK' and memname=upcase("&dsn1");
%let dim1=&sqlobs;
select name into :namelist2 separated by ' '
from dictionary.columns
where libname='WORK' and memname=upcase("&dsn2");
%let dim2=&sqlobs;
quit;
%put namelist=&namelist  namelist2=&namelist2 &dim1 &dim2;
%do i=1 %to &dim2;
%let count=0;
%let word2=%scan(&namelist2,&i);
    %do j=1 %to &dim1 %until(&count=1);;
%let word1=%scan(&namelist,&j);
    %if &word2=&word1   %then %do;
    %put variable &word2 is  in &dsn1;
%let count=%eval(&count+1);
%end;
%end;
%if &count=0  %then %put variable &word2 is not in &dsn1;
%end;
%mend sssss;
Use the macro language to compare variable names(strings) is not quite suitable for the problem. I modify it a little. See below.

data t1(drop=x2) t2(drop=x3);
  retain x1-x5 (5*0);
  output;
run;
%macro sssss(dsn1,dsn2);
proc sql noprint;
create table _&dsn1 as
select name into :namelist separated by ' '
from dictionary.columns
where libname='WORK' and memname=upcase("&dsn1")
order by 1
;
create table _&dsn2 as
select name
from dictionary.columns
where libname='WORK' and memname=upcase("&dsn2")
order by 1
;
quit;
data _all_;
   merge _&dsn1(in=a) _&dsn2(in=b);
   by name;
   flag=a+b*2;
run;
title "1=in &dsn1 :: 2=in &dsn2 :: 3=in both";  
proc print data=_all_;
run;
title '' ;
proc datasets;
delete _&dsn1 _&dsn2 _all_;
quit;
%mend sssss;
%sssss(t1,t2)
已有 1 人评分经验 热心指数 收起 理由
crackman + 100 + 1 精彩帖子

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

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

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