2017-03-22 133 views
0

在SAS中,我喜歡製作一個動態文件名,因爲我正在每天的表格上瀏覽我的數據。在文件名中包含宏

我曾嘗試包括在像這樣的文件名宏:

%let date=input(put(today()-3,ddmmyy6.),6.); *This is equal to todays date-3 (format = 190317) 
filename nlp "DailyB.DG%date"; 

它不工作,你能幫幫我嗎?

要得到什麼,我喜歡做我已張貼下面 一個例子,我希望有一個日期減去從今天3天這種格式的直覺:DDMMYY(190317) 所以,如果我以後的日子運行代碼這將是200317.

該變量應被放入代碼,所以我得到如下:

filename nlp 'DailyB.DG190317'; 

回答

1

,你需要%sysfunc。這是一種方法。

%let date=%sysfunc(putn(%eval(%sysfunc(today())-3),ddmmyyn6.)); *This is equal to todays date-3 (format = 190317); 
%put &=date; 

第一%sysfunc詢問的today()的結果,第二詢問要格式化的結果。需要%eval才能從值中減去3,正如@Quentin在評論中指出的那樣。

或者,call symputx可以在這裏工作,如果您在數據步驟中更加舒適。

data _null_; 
    call symputx('date',put(today()-3,ddmmyyn6.)); 
run; 
%put &=date; 
0

您需要使用%sysfunc()和%的eval()宏函數來評估數據步驟之外的數據步驟功能。喬說:

%let date=%sysfunc(putn(%eval(%sysfunc(today())-3),ddmmyyn6.)); 

然後,你需要如果你想有一個宏變量來解決功能改變你%&

filename nlp "DailyB.DG&date"; 
+1

我不認爲這就夠了。應該需要一個%sysfunc。也許%sysfunc(today() - 3,ddmmyy6)。不知道這是否會起作用,或者需要%eval(today() - 3)。 – Quentin

+0

你說得對,我錯過了。 – DomPazz

+1

'%eval()'不需要。像PUTN()這樣的SAS函數可以將表達式作爲參數。 – Tom

0

你現在試着那麼什麼用文件名語句落得像

filename nlp "DailyB.DGinput(put(today()-3,ddmmyy6.),6.)"; 

要在你需要使用%SYSFUNC()宏代碼運行的功能。您還需要使用PUTN()函數,因爲PUT()函數不適用於%SYSFUNC()

%let date=%sysfunc(putn(%sysfunc(today())-3,ddmmyyn6)); 
filename nlp "DailyB.DG&date"; 

如果您可以改變過程,我會建議使用8個字符作爲名稱的日期部分,以便您可以包括世紀。此外,如果您使用年,月,日爲您的日期字符串命令生成的文件名將按適當的日期順序進行排序,並防止用戶混淆哥倫布日爲杜威十進制系統日。