SAS宏用char和num参数写入文本文件

时间:2018-04-16 21:20:25

标签: sas sas-macro

我正在尝试编写一个使用参数值创建文本文件的宏。我理解所有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.

1 个答案:

答案 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.));