2017-07-27 36 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,\/);