我首先要说的是我对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当时拒绝了冒号。谁能帮我吗?提前谢谢!
答案 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