我想做以下请求:
data _null_;
call symputx("test",findw(' x y z ','x'));
run;
使用宏变量代替
' x y z '
部分,即
data _null_;
call symputx("test",findw(&mv,'x'));
run;
其中mv是一个宏变量,其值由我无法修改的宏函数计算。我们假设这个值是:
%let mv=x y z;
我的问题是如果mv不包含引号,代码将无效:
ERROR 388-185: Expecting an arithmetic operator.
我尝试使用%str
添加它们(同样,我无法修改mv的计算方式,所以我必须使用&mv
):
%let mv2=%str(%') &mv %str(%');
并使用%put
,我可以看到mv2值为'x y z'
但是我得到了与以前类似的错误(不完全相同):
ERROR 386-185: Expecting an arithmetic expression.
如果您尝试使用%let mv=' x y z ';
,它可以正常工作,但我不能做这样的事情,因为我必须使用&mv
(或者我可以吗?)。
我不明白什么是错的,我该怎么办?
答案 0 :(得分:1)
宏变量只是文本填充。宏变量在数据步骤中需要是合法的SAS值。
%let mv=123;
data _null_;
x="&mv";
put x=;
run;
例如。 "
(双引号)解析宏变量,'
(单引号)不会。
在您的示例中,您也可以在没有问题的情况下执行此操作。
%let mv2 = %sysfunc(findw(&mv,x,,ios))
重要细节:SYSFUNC没有为任何参数设置引号(它会将引号视为一个字符,而不是引用任何内容),如果它是空格分隔的,则需要一种方法来获取该字段中的空格留空空间不起作用。 FINDW有一些特定的问题也与它有多个带有数字和字符可选参数的结构有关。