如何读取 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';,));