是否可以在单个宏中添加多个SAS宏值
例如,我有两个宏变量是否可以在单个宏中添加多个SAS宏值,sas,sas-macro,Sas,Sas Macro,例如,我有两个宏变量 %let A = ('a','b','c'); %let B = ('d','e','f'); 我正在尝试从以上两个宏变量创建一个新的宏变量 %let c = ('a','b','c','d','e','f'); I tried %let c = (&A,&B); 在%SYSFUNC中使用compress()函数删除a和B中的括号 您需要使用%(和%)来表示括号,并防止它们被解释为%SYSFUNC的闭包 %LET A = ('a','b','c') ;
%let A = ('a','b','c');
%let B = ('d','e','f');
我正在尝试从以上两个宏变量创建一个新的宏变量
%let c = ('a','b','c','d','e','f');
I tried %let c = (&A,&B);
在%SYSFUNC中使用compress()函数删除a和B中的括号
您需要使用%(和%)来表示括号,并防止它们被解释为%SYSFUNC的闭包
%LET A = ('a','b','c') ;
%LET B = ('d','e','f') ;
%LET A2 = %SYSFUNC(compress(&A,%(%))) ;
%LET B2 = %SYSFUNC(compress(&B,%(%))) ;
%LET C = (&A2,&B2) ;
/* or all in one... */
%LET C = (%SYSFUNC(compress(&A,%(%))),%SYSFUNC(compress(&B,%(%)))) ;
%PUT &C ;
Macro variable C resolves to ('a','b','c','d','e','f')
%设A=('A','b','c');
%设B=('d','e','f');
%设A2=%SYSFUNC(压缩(&A,%);
%设B2=%SYSFUNC(压缩(&B,%(%);
%设C=(&A2,&B2);
/*或是一个整体*/
%设C=(%SYSFUNC(compress(&A,%%%),%SYSFUNC(compress(&B,%%%));
%PUT&C;
宏变量C解析为('a'、'b'、'C'、'd'、'e'、'f')
顺便说一句,如果您打算在in()条件下使用&C,它将按原样工作,即
%LET A = ('a','b','c') ;
%LET B = ('d','e','f') ;
%LET C = (&A,&B) ;
data test ;
letter = 'd' ;
exist = letter in &C ; /* resolves to (('a','b','c'),('d','e','f')) */
run ;
%设A=('A','b','c');
%设B=('d','e','f');
%设C=(&A,&B);
数据测试;
字母='d';
exist=字母在&C;/*解析为(('a','b','c'),('d','e','f'))*/
跑
在%SYSFUNC中使用compress()函数删除a和B中的括号
您需要使用%(和%)来表示括号,并防止它们被解释为%SYSFUNC的闭包
%LET A = ('a','b','c') ;
%LET B = ('d','e','f') ;
%LET A2 = %SYSFUNC(compress(&A,%(%))) ;
%LET B2 = %SYSFUNC(compress(&B,%(%))) ;
%LET C = (&A2,&B2) ;
/* or all in one... */
%LET C = (%SYSFUNC(compress(&A,%(%))),%SYSFUNC(compress(&B,%(%)))) ;
%PUT &C ;
Macro variable C resolves to ('a','b','c','d','e','f')
%设A=('A','b','c');
%设B=('d','e','f');
%设A2=%SYSFUNC(压缩(&A,%);
%设B2=%SYSFUNC(压缩(&B,%(%);
%设C=(&A2,&B2);
/*或是一个整体*/
%设C=(%SYSFUNC(compress(&A,%%%),%SYSFUNC(compress(&B,%%%));
%PUT&C;
宏变量C解析为('a'、'b'、'C'、'd'、'e'、'f')
顺便说一句,如果您打算在in()条件下使用&C,它将按原样工作,即
%LET A = ('a','b','c') ;
%LET B = ('d','e','f') ;
%LET C = (&A,&B) ;
data test ;
letter = 'd' ;
exist = letter in &C ; /* resolves to (('a','b','c'),('d','e','f')) */
run ;
%设A=('A','b','c');
%设B=('d','e','f');
%设C=(&A,&B);
数据测试;
字母='d';
exist=字母在&C;/*解析为(('a','b','c'),('d','e','f'))*/
跑
虽然可以像Chris J所展示的那样组合它们,但更好的答案是不要以这种方式存储它们。如果您将它们与括号一起存储,因为您稍后将在需要括号的情况下使用它们,那么只需提供它们即可
%let A = 'a','b','c';
%let B = 'd','e','f';
%let C = &a,&b;
data want;
set have;
if a in (&a) or b in (&b) or c in (&c) then do;
output;
end;
run;
这样的代码就简单多了。虽然可以像Chris J所展示的那样组合它们,但更好的答案是不要以这种方式存储它们。如果您将它们与括号一起存储,因为您稍后将在需要括号的情况下使用它们,那么只需提供它们即可
%let A = 'a','b','c';
%let B = 'd','e','f';
%let C = &a,&b;
data want;
set have;
if a in (&a) or b in (&b) or c in (&c) then do;
output;
end;
run;
这样的代码就简单多了。如果您是定义A和B的人,那么您可以在定义这两个变量时去掉括号
%let A = 'a','b','c';
%let B = 'd','e','f';
%let C = (&A,&B);
%PUT &C ;
来自日志的结果-('a'、'b'、'c'、'd'、'e'、'f')
乔。。。这不是更简单吗?如果您是定义A和B的人,那么您可以在定义这两个变量时去掉括号
%let A = 'a','b','c';
%let B = 'd','e','f';
%let C = (&A,&B);
%PUT &C ;
来自日志的结果-('a'、'b'、'c'、'd'、'e'、'f')
乔。。。这不是更简单吗?Keni,我不知道我的评论是什么。这与我所说的几乎相同——定义它们时不使用括号。唯一的区别是我也不会用括号来定义C,以使它更灵活。是的,我的回答与你的类似,我们如何操作变量A和B。我假设以类似的方式操作C会得到OP想要的结果。这是我第一次对如此混乱的道歉做出回应。我渐渐地了解了这样的风格。想跟上你是不可能的。凯尼,我不知道你对我的评价是什么。这与我所说的几乎相同——定义它们时不使用括号。唯一的区别是我也不会用括号来定义C,以使它更灵活。是的,我的回答与你的类似,我们如何操作变量A和B。我假设以类似的方式操作C会得到OP想要的结果。这是我第一次对如此混乱的道歉做出回应。我渐渐地了解了这样的风格。想跟上你是不可能的。