将日期时间戳添加到 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
首先我要说我对 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