SAS不评估%PUT的内容
我在任何SAS不评估%PUT的内容,sas,sas-macro,Sas,Sas Macro,我在任何数据步骤之外使用此位 %let sth = 20191111; %let sthelse=SUBSTR(INPUT(&sth.,12.),1,4); %put &sthelse.; 它不会产生“2019”,我希望是这样 SUBSTR(INPUT(20191111,12.),1,4) 这里出了什么问题?SUBSTR是datastep函数。 尝试将其用于宏功能: %let sth = 20191111; %let sthelse=%sysfunc(SUBSTR(%sysf
数据
步骤之外使用此位
%let sth = 20191111;
%let sthelse=SUBSTR(INPUT(&sth.,12.),1,4);
%put &sthelse.;
它不会产生“2019”,我希望是这样
SUBSTR(INPUT(20191111,12.),1,4)
这里出了什么问题?SUBSTR是datastep函数。 尝试将其用于宏功能:
%let sth = 20191111;
%let sthelse=%sysfunc(SUBSTR(%sysfunc(INPUTn(&sth.,12.)),1,4));
%put &sthelse.;
没有名为substr和input的宏函数,该函数是“数据步函数”。您应该使用语句。宏变量存储为文本,因此不应在其上使用
input
函数
%let sth = 20191111;
%let sthelse=%sysfunc(SUBSTR(&sth.,1,4));
%put &=sthelse.;
S=2019年
更新(谢谢):
有宏函数,因此您可以使用
%SUBSTR(&sth.,1,4)
而不是%sysfunc(SUBSTR(&sth.,1,4))
您不了解宏预处理器的工作原理。它只是一个文本替换工具。它查找两个触发器字符,%
和&
,以查看需要在哪里工作。您可以在您的声明中看到这两个方面的作用:
%let sthelse=SUBSTR(INPUT(&sth.,12.),1,4);
因此,%
将触发宏处理器,并将%let
识别为宏语句。然后,&
触发器将使其将&sth.
视为要替换的宏变量引用。所以它取代了这个,你就得到了这个陈述
%let sthelse=SUBSTR(INPUT(20191111,12.),1,4);
由于没有更多的宏触发器,SAS愉快地将该文本存储到宏变量s LSE
中
您似乎还对数字和字符串的工作方式感到困惑。如果您编写此代码:
data x;
x=INPUT("20191111",12.);
run;
您将要求SAS将字符串20191111
转换为数字20191111。所以X是一个数值变量。因此,它将具有与运行此语句相同的效果
x=20191111;
现在,如果您要求SAS尝试对该数值使用SUBSTR()函数,请执行以下操作:
y=substr(x,1,4);
SAS首先需要将X转换为字符串。它会很乐意为您这样做,但它会使用最好的12。格式进行转换。因此,您的号码20191111将成为字符串
20191111
所以它将有4个前导空格。然后,如果你取前四个字符,你会得到四个空格
您是否打算改为运行此代码
%let sth = 20191111;
%let sthelse=%substr(&sth,1,4);
这将使用宏函数%SUBSTR()获取给定字符串的前四个字符。由于您为它提供了字符串
20191111
(对于宏处理器来说,一切都是字符串,不需要引号),因此结果将是字符串2019
使用宏函数%SUBSTR
提取其参数的一部分。请记住,宏值只是字符值(不要与数据步字符变量和值混淆),没有明确的数值,即使宏值由所有数字组成
%let sth = 20191111;
%let first4 = %substr(&sth,1,4);
注意已经有一个宏函数%SUBSTR()。无需要求SAS跳转到使用SUBSTR()函数。