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

时间:2015-08-19 18:35:10

标签: datetime sas filenames

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

我需要命名SAS Transport(XPT)文件,格式为" CR845_CLIN2001_LB_Date_Time.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当时拒绝了冒号。谁能帮我吗?提前谢谢!

5 个答案:

答案 0 :(得分:2)

这对你的目的来说可能有点过头了,但是其他人可能觉得这很有用。在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

如果您想添加秒数,则其标记为:%0S

答案 1 :(得分:1)

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

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

然而,对于9.1.3,不支持B8601DT(以及其他IEEE日期格式),因为那是大约十五年......你必须提出另一个更零碎的解决方案。

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

答案 2 :(得分:0)

好吧,我拼凑了一个非常糟糕的解决方案。它有效,但它像罪一样丑陋。我添加了这个烂摊子:

%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

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

答案 3 :(得分:0)

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

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

如果要包含秒数,请使用TIME8而不是TIME5格式。

答案 4 :(得分:0)

由于冒号是问题,你可以使用我认为在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