【问题标题】:How to read User select Values of a static list of a SAS Prompt如何读取 SAS 提示的静态列表的用户选择值
【发布时间】:2018-07-17 07:00:03
【问题描述】:

我的程序有五个文件,每个文件都有一个宏。我试图创建一个存储过程,提示用户打开哪个文件(我无权将文件保存在 SAS 文件夹所在的数据库中)。 Prompt 称为 Prompt_1,具有静态 List 的五个值(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 的值并将其与“用户选择静态列表的值”进行比较?

附:如果没有 IF 语句,程序会打开文件并执行代码 感谢您的帮助

【问题讨论】:

  • 从 SAS 版本 9.4M5 开始,您可以在开放代码中使用 %IF,但不能以您正在使用的形式使用。您必须将要在 %THEN 或 %ELSE 之后运行的语句用 %DO/%END 块括起来。

标签: static sas prompt


【解决方案1】:

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;

MACRO '关联数组'

对于提示选择值没有空格或特殊字符的情况,可以在一系列宏变量中指定潜在的目标文件。

%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)";

提示对话框选择值

您可以更改提示对话框以返回要包含的文件名。要么是完整路径

%include "&prompt_1";

或路径的一部分(例如只是名称部分“1_First”)

%include "/home/admin/mohaddad/sasuser.v94/&PROMPT_1..sas";

%SYSFUNC(IFC

在开放代码中有条件地处理语句的一种骇人听闻的方法是使用%sysfunc(ifc(… IFC 是一个函数,它计算表达式并为真情况返回一个字符串,为假情况返回一个不同的(或无字符串)。连续五个这样的语句不会损害任何代码或资源,其中只有一个测试为真。

%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';,));

【讨论】:

  • 谢谢兄弟,它与 DATA _ NULL _ 一起使用;呼叫执行感谢您的帮助
  • @mohammadhaddad - 请选择这个或 Allen 的回复和 mark it as the answer 回答您的问题
【解决方案2】:

开放代码宏逻辑不可用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";

【讨论】:

  • 谢谢,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
相关资源
最近更新 更多