将日期时间戳添加到 SAS 9.1.3 文件名?

Add Datetime Stamp to SAS 9.1.3 Filename?

首先我要说我对 SAS 的经验很少。我在 Windows 中使用 SAS 9.1.3。我别无选择。

我需要使用 "CR845_CLIN2001_LB_Date_Time.xpt" 格式命名 SAS 传输 (XPT) 文件。目前我有一个只用日期命名的脚本 (sysdate9)。

使用日期的代码行如下 - 这些是我认为需要更改的行 - 它们并非全部在一个块中:

libname XPORTOUT xport "\ACMSHARES2\CLNTRIAL\DataMgt\C1845\DataTransfer\Data\Sent\SAS\CR845_CLIN2001_LB_&sysdate9..xpt";

data LabData.&fileBaseName._&sysdate9 (COMPRESS=YES);

data LB.LB; 
    set LabData.&fileBaseName._&sysdate9; 
run;

proc contents data = LabData.&fileBaseName._&sysdate9 varnum;
run;

我已经尝试了几件事,但 SAS 当时拒绝使用冒号。谁能帮我吗?提前致谢!

Windows 文件名中不允许使用冒号。使用更好的格式,比如我个人的喜好,b8601dt:

proc export data=sashelp.class 
            outfile="c:\temp\class_%sysfunc(datetime(),B8601DT15.).csv" 
            dbms=csv replace;
run;

但是,对于 9.1.3,不支持 B8601DT(和其他 IEEE 日期格式),因为它已有大约 15 年的历史了……您必须想出另一个更零碎的解决方案。

我在这里的偏好是以 为单位表示时间,这将使文件名仍然能够唯一(并正确排序)。拆分日期和时间。我在这里假设您使用 &sysdate9 是可以接受的(这是 SAS starts 的日期,而不是今天的日期,但如果这是批处理作业就可以了) ;但我仍然使用 %today() 而不是 &systime,因为它更容易快速格式化。

好吧,我拼凑了一个非常糟糕的解决方案。它有效,但它像罪恶一样丑陋。我添加了这个乱七八糟的东西:

%let cyear=%sysfunc(putn("&sysdate9"d, year4.));
%let cmon =%SUBSTR(%SYSFUNC(PUTN(%sysevalf(%SYSFUNC(TODAY())),DATE9.)),3,3);
%let cday =%SUBSTR(%SYSFUNC(PUTN(%sysevalf(%SYSFUNC(TODAY())),DATE9.)),1,2);
%let chour=%SUBSTR(%SYSFUNC(PUTN(%sysevalf(%SYSFUNC(TIME())),TIME5.)),1,2);
%let cmin=%SUBSTR(%SYSFUNC(PUTN(%sysevalf(%SYSFUNC(TIME())),TIME5.)),4,2);

然后将其替换为我最初问题中显示的代码行中的 "sysdate9":

&cyear&cmon&cday._&chour&cmin

它有效,但我讨厌它。欢迎改进!

这对您的目的来说可能有点矫枉过正,但其他人可能会觉得这很有用。在 SAS 中,当您发现缺少现有的日期时间格式时,您可以创建自己的日期时间格式。

很好的白皮书can be found here

这是一个示例,可以创建您要实现的格式:

proc format;
  picture myfmt low-high = '%Y%0m%0d_%0H%0M' (datatype = datetime) ;
run ;

用法示例:

%put %sysfunc(datetime(), myfmt.);

给出:

20150819_1304

如果要加秒,则token为:%0S.

用你想要的后缀生成一个宏变量。我建议使用 YYYYMMDD_HHMM 格式,因为它会正确排序。然后在生成 XPORT 文件的名称时使用新的宏变量代替 &SYSDATE9。

%let dt=%sysfunc(today(),yymmddn8)_%sysfunc(compress(%sysfunc(time(),time5),:));
libname XPORTOUT xport "\....\CR845_CLIN2001_LB_&dt..xpt";

如果您想包括秒数,请使用 TIME8 而不是 TIME5 格式。

由于冒号是问题所在,您可以使用我认为 SAS 9.1.3 中确实存在的压缩功能删除它们。不漂亮,但快速有效。

%let today=%sysfunc(datetime(), datetime21.);
%let today=%sysfunc(compress(&today, :));
%put &today;

19AUG2015141413

还有另一种让 T 进去的方法

data _null_;
date=put(datetime(), datetime21. -l);
substr(date, 10, 1)="T";
date=compress(date, ":");
call symputx('date_value', date);
run;

%put &date_value;

19AUG2015T141801