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()函数。