如何读取 SAS 提示符静态列表的用户 select 值
How to read User select Values of a static list of a SAS Prompt
我的程序有五个文件,每个文件都有一个宏。我试图创建一个存储过程,提示用户打开哪个文件(我无权将文件保存在 SAS 文件夹所在的数据库中)。
提示称为 Prompt_1 并具有静态列表的五个值(1_First、2_second、3_third、4_fourth、5_fifth)。
在存储过程管理器 > SAS 代码页 > 我输入了:
%if &Prompt_1= 1_First %then
%include '/home/admin/mohaddad/sasuser.v94/1_ First.sas';
%else %if & Prompt_1= 2_second %then
%include '/home/admin/mohaddad/sasuser.v94/2_ second.sas';
.....
我得到的错误:%IF 语句在开放代码中无效。
问题是:如何读取Prompt_1的值并将其与“用户select静态列表的值”进行比较?
P.S。如果没有 IF 语句,程序将打开文件并执行代码
感谢帮助
开放代码宏逻辑不可用until version 9.4m5。您现在的一个选择是将其包装在一个宏中并调用它:
%macro mymacro()
%if &Prompt_1= 1_First %then %do;
%include '/home/admin/mohaddad/sasuser.v94/1_First.sas';
%end;
%else %if &Prompt_1= 2_second %then %do;
%include '/home/admin/mohaddad/sasuser.v94/2_second.sas';
%end;
%mend;
%mymacro()
另一种选择(假定您的程序名称似乎与提示值相同)是简单地使用 %include
路径中的提示宏值:
%include "/home/admin/mohaddad/sasuser.v94/&prompt_1..sas";
SAS 9.4M4 版之前不允许开放代码 %if 语句。 %IF 的 9.4M5 文档表明 SAS Foundation 的更新已删除该限制。
处理提示选择的方法有很多种。
宏
编写一个宏,以有条件的方式处理选择。我建议将 %include
放在 %do
块中,以确保所需的语句分号是条件语句的一部分。
%macro process_selection;
%if &Prompt_1 = 1_First %then %do;
%include '/home/admin/mohaddad/sasuser.v94/1_ First.sas';
%end;
%else
%if & Prompt_1= 2_second %then %do;
%include '/home/admin/mohaddad/sasuser.v94/2_ second.sas';
%end;
%* etc …;
%mend;
%* invoke the macro;
%process_selection;
数据_空_;呼叫执行
数据步骤可以有条件地执行带有CALL EXECUTE
的语句。最佳做法是将语句包装在 %NRSTR
中,以确保它将在 DATA 步完成后执行。
您还可以将 IF/THEN/ELSE 替换为 SELECT/WHEN 语句。
data _null_;
if "&prompt_1" = "1_First" then
call execute ( '%nrstr(%include "/home/admin/mohaddad/sasuser.v94/1_ First.sas";)' );
else
if "&x" = "hello there2" then
call execute ( '%nrstr(%/home/admin/mohaddad/sasuser.v94/2_ second.sas";)' );
run;
宏'associate array'
对于提示选择值没有space或特殊字符的情况,可以在一系列宏变量中指定潜在的目标文件。
%let FILE_1_First = /home/admin/mohaddad/sasuser.v94/1_ First.sas;
%let FILE_2_Second = /home/admin/mohaddad/sasuser.v94/2_ Second.sas;
%include "%superq(FILE_&PROMPT_1)";
提示对话框选择值
您可以将提示对话框更改为 return 要包含的文件名。全路径
%include "&prompt_1";
或路径的一部分(例如名称部分“1_First”)
%include "/home/admin/mohaddad/sasuser.v94/&PROMPT_1..sas";
%SYSFUNC(IFC
在开放代码中有条件地处理语句的一种骇人听闻的方法是使用 %sysfunc(ifc(…
IFC
是一个函数,它计算一个表达式,returns 一个字符串用于 true 的情况,而另一个(或无字符串)用于 false 的情况。连续使用五个这样的语句不会损害任何代码或资源,其中只有一个测试为真。
%sysfunc(ifc(&Prompt_1 = 1_First
, %include '/home/admin/mohaddad/sasuser.v94/1_ First.sas';,));
%sysfunc(ifc(&Prompt_1 = 2_Second
, %include '/home/admin/mohaddad/sasuser.v94/2_ second.sas';,));
我的程序有五个文件,每个文件都有一个宏。我试图创建一个存储过程,提示用户打开哪个文件(我无权将文件保存在 SAS 文件夹所在的数据库中)。 提示称为 Prompt_1 并具有静态列表的五个值(1_First、2_second、3_third、4_fourth、5_fifth)。
在存储过程管理器 > SAS 代码页 > 我输入了:
%if &Prompt_1= 1_First %then
%include '/home/admin/mohaddad/sasuser.v94/1_ First.sas';
%else %if & Prompt_1= 2_second %then
%include '/home/admin/mohaddad/sasuser.v94/2_ second.sas';
.....
我得到的错误:%IF 语句在开放代码中无效。
问题是:如何读取Prompt_1的值并将其与“用户select静态列表的值”进行比较?
P.S。如果没有 IF 语句,程序将打开文件并执行代码 感谢帮助
开放代码宏逻辑不可用until version 9.4m5。您现在的一个选择是将其包装在一个宏中并调用它:
%macro mymacro()
%if &Prompt_1= 1_First %then %do;
%include '/home/admin/mohaddad/sasuser.v94/1_First.sas';
%end;
%else %if &Prompt_1= 2_second %then %do;
%include '/home/admin/mohaddad/sasuser.v94/2_second.sas';
%end;
%mend;
%mymacro()
另一种选择(假定您的程序名称似乎与提示值相同)是简单地使用 %include
路径中的提示宏值:
%include "/home/admin/mohaddad/sasuser.v94/&prompt_1..sas";
SAS 9.4M4 版之前不允许开放代码 %if 语句。 %IF 的 9.4M5 文档表明 SAS Foundation 的更新已删除该限制。
处理提示选择的方法有很多种。
宏
编写一个宏,以有条件的方式处理选择。我建议将 %include
放在 %do
块中,以确保所需的语句分号是条件语句的一部分。
%macro process_selection;
%if &Prompt_1 = 1_First %then %do;
%include '/home/admin/mohaddad/sasuser.v94/1_ First.sas';
%end;
%else
%if & Prompt_1= 2_second %then %do;
%include '/home/admin/mohaddad/sasuser.v94/2_ second.sas';
%end;
%* etc …;
%mend;
%* invoke the macro;
%process_selection;
数据_空_;呼叫执行
数据步骤可以有条件地执行带有CALL EXECUTE
的语句。最佳做法是将语句包装在 %NRSTR
中,以确保它将在 DATA 步完成后执行。
您还可以将 IF/THEN/ELSE 替换为 SELECT/WHEN 语句。
data _null_;
if "&prompt_1" = "1_First" then
call execute ( '%nrstr(%include "/home/admin/mohaddad/sasuser.v94/1_ First.sas";)' );
else
if "&x" = "hello there2" then
call execute ( '%nrstr(%/home/admin/mohaddad/sasuser.v94/2_ second.sas";)' );
run;
宏'associate array'
对于提示选择值没有space或特殊字符的情况,可以在一系列宏变量中指定潜在的目标文件。
%let FILE_1_First = /home/admin/mohaddad/sasuser.v94/1_ First.sas;
%let FILE_2_Second = /home/admin/mohaddad/sasuser.v94/2_ Second.sas;
%include "%superq(FILE_&PROMPT_1)";
提示对话框选择值
您可以将提示对话框更改为 return 要包含的文件名。全路径
%include "&prompt_1";
或路径的一部分(例如名称部分“1_First”)
%include "/home/admin/mohaddad/sasuser.v94/&PROMPT_1..sas";
%SYSFUNC(IFC
在开放代码中有条件地处理语句的一种骇人听闻的方法是使用 %sysfunc(ifc(…
IFC
是一个函数,它计算一个表达式,returns 一个字符串用于 true 的情况,而另一个(或无字符串)用于 false 的情况。连续使用五个这样的语句不会损害任何代码或资源,其中只有一个测试为真。
%sysfunc(ifc(&Prompt_1 = 1_First
, %include '/home/admin/mohaddad/sasuser.v94/1_ First.sas';,));
%sysfunc(ifc(&Prompt_1 = 2_Second
, %include '/home/admin/mohaddad/sasuser.v94/2_ second.sas';,));