我有一个名为list1的宏变量,它给出:
%put &list1.;
A,B,C,D,,,G,,I,,
我需要删除那些缺失的项目,即逗号之间为空。最终输出应类似于A,B,C,D,G,I
。可能吗?修剪功能在这里似乎不起作用。我是SAS的新手,因此在这里将对您有所帮助。谢谢。
答案 0 :(得分:2)
%let a= A,B,C,D,,,G,,I,,;
data c;
val = tranwrd(trim(compbl(tranwrd("&a",","," "))), " ",",");
call symput('b',val);
run;
%put &b;
A,B,C,D,G,I的结果
答案 1 :(得分:1)
只是为了好玩-纯宏正则表达式版本:
%let a= A,B,C,D,,,G,,I,,;
%let regex1 = %sysfunc(prxparse(%str(s/,+/,/)));
%let b=%sysfunc(prxchange(®ex1,-1,%quote(&a)));
%let regex2 = %sysfunc(prxparse(%str(s/,$//)));
%let b=%sysfunc(prxchange(®ex2,-1,%quote(&b)));
%put b= &b;
如果您不必在输入末尾处理尾随逗号,则可以跳过第二个正则表达式。
答案 2 :(得分:1)
您可以将逗号转换为空格,并使用COMPBL()
折叠多个空格。然后将空格转换回逗号。如果您有空格,只需交换逗号和空格字符即可。
%let temp=%sysfunc(translate(%superq(list1),%str( ,),%str(, )));
%let temp=%sysfunc(compbl(%superq(temp)));
%let list2=%sysfunc(translate(%superq(temp),%str( ,),%str(, )));
PS 您通常不希望在宏变量中使用逗号作为定界符。由于使用逗号分隔参数值,因此很难将值传递给其他宏或函数。因此,此代码中的所有宏引用功能都起作用。对于变量列表,通常需要一个以空格分隔的列表,在该列表中多个相邻空格无关紧要。对于其他类型的列表,通常需要使用另一个定界符,例如|
或^
。