我的目标是在全局SAS变量中连接一个长目录字符串,而不使用额外的数据步骤。我有以下代码:
%let deadline='31Dec2019'd;
%let rootDir=Y:PD;
%let timestamp=input(&deadline.,yymmdd8.);
%let PATH=&rootDircurrentStats×tamp.;
%put &PATH.--;
这给了我一个让我困惑的错误:
检测到开放代码语句递归。
我也尝试了%input
、%put
和put
而不是input
,但总是出现相同的错误。我对SAS仍然不太流利,所以请原谅我这个愚蠢的问题,但我在网上找不到任何有效的解决方案,而且这里似乎也没有人问过。
没有解决我的问题的资源:
https://communities.sas.com/t5/SAS-Programming/Convert-Date-to-Character/td-p/349562
https://communities.sas.com/t5/SAS-Procedures/Converting-date-to-Character/td-p/90392
SAS(字符串到日期(中的日期转换
- 将日期文本源代码段评估为日期值
- 使用格式
B8601DA8.
将日期值呈现为yyyymmdd
SAS宏可以通过%sysfunc
宏函数使用Base函数。
语法为
%let result = %sysfunc ( <function-name> ( <arg-1>, ... ) );
在宏中,字符串文本被传递给函数,而不使用将其用单引号括起来。为什么?因为宏的核心是一个只处理字符串的系统,可能会产生代码编写的副作用。
您的更改
宏变量实际上包含日期文本的源代码。您需要将其评估为日期值,然后将结果格式化为所需的文件名部分构造(yy-mm-dd-(
%let deadline='31Dec2019'd;
%let ymd_str=%sysfunc(putn(&deadline,yymmdd6.));
%put &=deadline;
%put &=ymd_str;
---------- Log ----------
DEADLINE='31Dec2019'd
YMD_STR=191231
有不同的日期表示可能是文件名的实际部分。以下是一些可能性:
/* date representation construct according to ----> format */
%put yymmdd : %sysfunc(putn(&deadline, yymmdd6.));
%put yy-mm-dd : %sysfunc(putn(&deadline, yymmdd8.));
%put yyyymmdd : %sysfunc(putn(&deadline, B8601DA8.));
%put yyyymmdd : %sysfunc(putn(&deadline, YYMMDDN8.));
----- log -----
yymmdd : 191231
yy-mm-dd : 19-12-31
yyyymmdd : 20191231
yyyymmdd : 20191231