SAS:删除宏变量中缺失的项目
SAS: Delete missing items in a macro variable
我有一个名为 list1 的宏变量,它给出:
%put &list1.;
A,B,C,D,,,G,,I,,
我需要删除那些缺失的项目,即逗号之间的空白。最终输出应该像 A,B,C,D,G,I
。可能吗? Trim 功能在这里似乎不起作用。我是 SAS 的新手,所以在这里将不胜感激任何帮助。谢谢
%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的结果
仅供娱乐 - 纯宏正则表达式版本:
%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;
如果您永远不必处理输入末尾的尾随逗号,则可以跳过第二个正则表达式。
您可以将逗号转换为 space 并使用 COMPBL()
折叠多个 space。然后将 space 转换回逗号。如果您有任何 space,只需交换逗号和 space 字符即可。
%let temp=%sysfunc(translate(%superq(list1),%str( ,),%str(, )));
%let temp=%sysfunc(compbl(%superq(temp)));
%let list2=%sysfunc(translate(%superq(temp),%str( ,),%str(, )));
PS 您通常不想在宏变量中使用逗号作为分隔符。由于逗号用于分隔参数值,因此很难将值传递给其他宏或函数。因此,此代码中的所有宏引用函数。对于变量列表,您通常需要一个 space 分隔列表,其中多个相邻的 space 无关紧要。对于其他类型的列表,您通常需要另一个分隔符,例如 |
或 ^
.
我有一个名为 list1 的宏变量,它给出:
%put &list1.;
A,B,C,D,,,G,,I,,
我需要删除那些缺失的项目,即逗号之间的空白。最终输出应该像 A,B,C,D,G,I
。可能吗? Trim 功能在这里似乎不起作用。我是 SAS 的新手,所以在这里将不胜感激任何帮助。谢谢
%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的结果
仅供娱乐 - 纯宏正则表达式版本:
%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;
如果您永远不必处理输入末尾的尾随逗号,则可以跳过第二个正则表达式。
您可以将逗号转换为 space 并使用 COMPBL()
折叠多个 space。然后将 space 转换回逗号。如果您有任何 space,只需交换逗号和 space 字符即可。
%let temp=%sysfunc(translate(%superq(list1),%str( ,),%str(, )));
%let temp=%sysfunc(compbl(%superq(temp)));
%let list2=%sysfunc(translate(%superq(temp),%str( ,),%str(, )));
PS 您通常不想在宏变量中使用逗号作为分隔符。由于逗号用于分隔参数值,因此很难将值传递给其他宏或函数。因此,此代码中的所有宏引用函数。对于变量列表,您通常需要一个 space 分隔列表,其中多个相邻的 space 无关紧要。对于其他类型的列表,您通常需要另一个分隔符,例如 |
或 ^
.