SAS宏可变分辨率

时间:2019-06-27 17:52:59

标签: function date sas

我很好奇为什么有些函数不能正确解释宏变量的字符类型。

这是一个示例程序

%let yymm = 1905;

data tst; 
reportDate = input(&yymm.,yymmn4.); 
run;

将产生一个数字值reportDate,并将其关联一个空值。

但是以下程序之一:

data tst;
reportDate = input("&yymm.",yymmn4.);
run;

data tst;
reportDate = input(put(&yymm.,4.),yymmn4.);
run;

将得出正确的值21670。

由于宏变量始终以字符形式解析,所以输入函数为什么不能正确解析宏变量引用?第一个参数需要一个字符值,已解析的引用为&yymm。是。我一直对这个功能感到好奇。

2 个答案:

答案 0 :(得分:2)

在变量周围引用

%let yymm = 1905;

data tst; 
reportDate = input("&yymm.",yymmn4.); 
run;

不带引号的尝试执行此操作:

 data tst; 
    reportDate = input(1905,yymmn4.); 
 run;

答案 1 :(得分:2)

一旦宏处理器完成了其不可思议的工作,生成的SAS代码就会由SAS自身进行作用。

代码之类的原因:

reportDate = input(1905,yymmn4.);

SAS写入LOG的注释中解释了导致缺少值的情况。

478   data tst;
479   reportDate = input(1905,yymmn4.);
480   run;

NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
      479:20

因为在INPUT()函数的第一个参数中使用了数字而不是字符串,所以SAS将其转换为字符串。这样做时,它使用了BEST12.格式,所以您最终得到了字符串' 1905' 从8个空格开始。由于您在信息中仅使用4个字符的宽度,因此结果是缺少值。转换后的字符串的后8个字符将被忽略。

另外两个版本通过给INPUT()一个字符串值来解决此问题。通过生成实际的字符串文字,或使用PUT()函数使用不会产生前导空格的格式将数字转换为字符串。