检查项目是否在 SAS 列表中

Ere*_*ren 2 sas

我有一个 SAS 列表。该 SAS 列表存储在宏变量中。请假设我没有表格来导出此 SAS 列表。

\n

SAS 列表包含以逗号分隔的名称。SAS 列表宏变量的示例:

\n
%LET sas_list = name1,name2,name3;\n
Run Code Online (Sandbox Code Playgroud)\n

我想检查宏变量 \xe2\x80\x9citem\xe2\x80\x9d 是否存在于列表中。

\n

就像是:

\n
%IF &item. IN &sas_list. %THEN %DO;\nWhatever;\n%END;\n
Run Code Online (Sandbox Code Playgroud)\n

由于某种原因,我收到错误:

\n
\xe2\x80\x9cA character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: name1 IN name1,name2,name3\xe2\x80\x9d\n
Run Code Online (Sandbox Code Playgroud)\n

感谢帮助。

\n

Stu*_*ski 5

添加minoperatormindelimiter系统选项。它们代表宏 IN 运算符和宏 IN 分隔符。

options minoperator mindelimiter=',';

%LET sas_list = name1,name2,name3;
%LET item = name1;

%IF &item. IN &sas_list. %THEN %DO;
    %put &item is in &sas_list;
%END;
Run Code Online (Sandbox Code Playgroud)

输出:

name1 is in name1,name2,name3
Run Code Online (Sandbox Code Playgroud)

如果您想查找不在列表中的值,请将其传递给%eval

options minoperator mindelimiter=',';

%LET sas_list = name1 name2 name3;
%LET item = name4;

%IF %eval(&item. IN &sas_list.) = 0 %THEN %DO;
    %put &item NOT in &sas_list;
%END;
Run Code Online (Sandbox Code Playgroud)

输出:

name4 is NOT in name1,name2,name3
Run Code Online (Sandbox Code Playgroud)

请注意,如果您只想有in选择地工作,也可以直接在宏中提供这些选项。例如:

%macro foo / minoperator mindelimiter=',';
    ...
%mend;
Run Code Online (Sandbox Code Playgroud)


Ker*_*mit 5

您需要在这里使用两个选项:

  1. MINOPERATOR,这将允许使用 IN 运算符
  2. MINDELIMITER,这将允许您设置分隔符
%let sas_list = name1,name2,name3;
options minoperator mindelimiter=',';
%Macro want(item);
    %if &item. in &sas_list. %then %put i = 1;
    %else %put i = 0;
%mend;
%want(name1);

i = 1
Run Code Online (Sandbox Code Playgroud)