Pan*_*ane 5 concatenation sas sas-macro
我只是想连接两个引用的宏变量,但似乎没有一个简单的方法.
说我们有:
%LET VAR1="This is not the greatest song in the world";
%LET VAR2="this is just a tribute.";
%LET TRIBUTE=%SYSFUNC(CATX(%STR( ),&VAR1,&VAR2));
%PUT &TRIBUTE;
Run Code Online (Sandbox Code Playgroud)
我其实想要:
"This is not the greatest song in the world this is just a tribute."
Run Code Online (Sandbox Code Playgroud)
但上面的代码实际上产生了:
"This is not the greatest song in the world" "this is just a tribute."
Run Code Online (Sandbox Code Playgroud)
所以,我尝试把%QUOTE(),%BQUOTE等.周围,&VAR1并%VAR2希望揭开报价,但我得到相同的结果.
唯一对我有用的是:
%LET TRIBUTE="%SUBSTR(&VAR1.,2,%LENGTH(&VAR1.)-2) %SUBSTR(&VAR2.,2,%LENGTH(&VAR2.)-2)";
Run Code Online (Sandbox Code Playgroud)
但这很难看,而且可以很快地变得冗长.有没有更好的方法来做到这一点?
您可以使用 COMPRESS 来执行此操作。
%LET VAR1="This is not the greatest song in the world";
%LET VAR2="this is just a tribute.";
%let VAR3=%sysfunc(compress(&VAR1,%str(%")));
%put &=var1 &=var3;
Run Code Online (Sandbox Code Playgroud)
删除引号有点棘手,但它确实有效。
您还可以在 FCMP 函数或函数式宏中执行此操作;这是一个例子。
%macro unquote_string(string=);
%sysfunc(compress(&string.,%str(%'%")))
%mend unquote_string;
%let VAR3="%unquote_string(string=&var1.) %unquote_string(string=&var2.)";
%put &=var3.;
Run Code Online (Sandbox Code Playgroud)
请注意,不应使用 CAT 函数来连接宏变量。它们只是文本,因此一个接一个地输入会自动将它们连接起来。
然而,“有没有更好的方法”问题的真正答案是不要将引号存储在宏变量中。大多数时候,您应该存储不带引号的宏变量,并在需要时在引号内使用它。SAS 宏并不将引号视为特殊的东西——它们只是字符串中的一个字符——所以它们没有专门的工具来处理这个问题。