我正在尝试编写一个使用参数值创建文本文件的宏。我理解所有SAS参数都是作为文本传递的,所以我需要将文本转换为数字。为此使用INPUT但仍然出现语法错误。感谢帮助。谢谢。
码
%macro test(n_var);
data _null_;
file"c:/temp/test.txt" TERMSTR=crlf;
put ;
put "(numeric variable passed = "input(&n_var,8.)")";
put ;
run;
%mend;
%test(n_var=100);
日志:
SYMBOLGEN: Macro variable N_VAR resolves to 100
NOTE: Line generated by the macro variable "N_VAR".
39 100
___
22
76
MPRINT(TEST): put "(numeric variable passed = "input(100,8.)")";
MPRINT(TEST): put ;
MPRINT(TEST): run;
ERROR 22-322: Syntax error, expecting one of the following: a name, arrayname, _ALL_, _CHARACTER_, _CHAR_, _NUMERIC_.
ERROR 76-322: Syntax error, statement will be ignored.
答案 0 :(得分:2)
所有SAS宏符号(也称为变量)都是文本。 SAS宏参数是文本。
您的用例可能不需要将文本转换为数字。
考虑:
%let x = 100;
data _null_;
my_num_var = &x;
run;
宏变量的分辨率(或者更好地理解为'符号')是字母1 0 0,但是关于要被解释为SAS代码的文本。数据步骤编译器推断my_num_var是它所看到的行
的数字 my_num_var = 100;
在某些用例中,您可能希望测试宏参数是否可以解释为数值。此类用例可能超出了您的需求。
INPUT功能是通过%sysfunc
功能无法在SAS宏中使用的特殊DATA Step功能之一。如果您必须在DATA步骤之外以“纯”方式“输入”值,则需要通过INPUTN
INPUTC
或%sysfunc
函数
%let evaluatedRepresentation = %sysfunc(inputn(&x,best8.));
输入的数字评估将转换为文本并分配给符号evaluatedRepresentation
。
如果你不能控制你进行&符号评估的宏的调用者,那么更安全的方法是通过SUPERQ
评估打破代码注入和其他anamolies
%let evaluatedRepresentation = %sysfunc(inputn(%superq(x),best8.));