我很好奇为什么有些函数不能正确解释宏变量的字符类型。
这是一个示例程序
%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。是。我一直对这个功能感到好奇。
答案 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()函数使用不会产生前导空格的格式将数字转换为字符串。