2017-07-27 35 views
2

我有一個關於if/then結構和(over)寫入文件的基本問題。SAS如果宏var等於字符串然後文件名

我的& name var被設置爲name_b,但aa.js總是被覆蓋並且bb.js.

data _null_; 
if "&name" = "name_a" then do; 
    filename cd_file '\\path\aa.js'; 
end; 
else if "&name" = "name_b" then do; 
    filename cd_file '\\path\bb.js'; 
end; 
run; 

我在做什麼錯?

回答

3

filename是一個全局聲明,不應該包含在datastep中。

您可以使用宏邏輯,而不是 - 如:

%macro example(); 
    %let name=name_a; /* as appropriate */ 
    %if &name = name_a %then %do; 
    filename cd_file '\\path\aa.js'; 
    %end; 
    %else %if &name = name_b %then %do; 
    filename cd_file '\\path\bb.js'; 
    %end; 
%mend; 
+0

謝謝,這個作品很有意義! – ByronSchuurman

0

FILENAME語句不是可執行的,所以當數據跳躍正在編譯他們會發生。所以,當你的IF語句運行時,兩個FILENAME語句都已經執行完畢。

您可以改用FILENAME()函數。

運行此示例以查看使用FILENAME()函數使賦值有條件。

%let name=name_a; 
%let path=%sysfunc(pathname(work)); 

data _null_; 
if "&name" = "name_a" then do; 
    filename cd_file "&path/aa.js"; 
end; 
else if "&name" = "name_b" then do; 
    filename cd_file "&path/bb.js"; 
end; 
run; 

%put CD_FILE -> %scan(%sysfunc(pathname(cd_file)),-1,\/); 

data _null_; 
if "&name" = "name_a" then do; 
    rc=filename('cd_file',"&path/aa.js"); 
end; 
else if "&name" = "name_b" then do; 
    rc=filename('cd_file',"&path/bb.js"); 
end; 
run; 

%put CD_FILE -> %scan(%sysfunc(pathname(cd_file)),-1,\/);