是否可以在单个宏中添加多个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想要的结果。这是我第一次对如此混乱的道歉做出回应。我渐渐地了解了这样的风格。想跟上你是不可能的。