从SAS中的类似单词列表中删除确切单词

从SAS中的类似单词列表中删除确切单词,sas,Sas,我有一个名为的宏变量&allvars中的数据集变量列表。我有另一个名为&contlist的宏变量,它包含&allvars中连续的变量。我试图提取&allvars中不在&contlist中的变量,即不连续的变量 这就是我所拥有的: %let binlist = &allvars; %let i = 1; %do %until( %scan(&var, &i, %str( )) = ); %let v = %scan(&var, &i, %str(

我有一个名为
的宏变量&allvars
中的数据集变量列表。我有另一个名为
&contlist
的宏变量,它包含
&allvars
中连续的变量。我试图提取
&allvars
中不在
&contlist
中的变量,即不连续的变量

这就是我所拥有的:

%let binlist = &allvars;
%let i = 1;

%do %until( %scan(&var, &i, %str( )) = );
    %let v = %scan(&var, &i, %str( ));

    %let j = 1;

    %do %until( %scan(&contlist, &j, %str( )) = );
        %let c = %scan(&contlist, &j, %str( ));

        %if %upcase(&v) = %upcase(&c) %then
            %let binlist = %sysfunc(tranwrd(&binlist, &v, %str()));

        %let j = %eval(&j + 1);
    %end;

    %let i = %eval(&i + 1);
%end;

%let binlist = %sysfunc(compbl(&binlist));
但是,当变量具有类似名称时,会出现问题,如:

%let allvars = x x1 x2 x3;
%let contlist = x x1 x2;
此处所需的输出将仅为
x3
,但由于调用
TRANWRD
,因此会生成
1 2 3

我唯一的另一个想法是将两个列表输出到数据集,合并它们,只保留
allvars
中的记录,而不在
contlist
中,然后从这些记录创建
binlist
。然而,必须有一个更简单、更优雅的解决方案


有什么想法吗?

如前所述,你的问题没有好的解决方案。有一些杂乱的(比你提供的更凌乱,我认为相当凌乱)。Perl正则表达式可能是最好的选择


最终,正确的答案是从数据集中找出这个问题。无论这意味着使用宏变量创建一个数据集(凌乱,当然),还是首先将其存储在数据集中,然后取出用于各种目的的数据块(正确的方法),这都是最好的解决方案。像这样的宏代码杂乱无章,容易出错,容易受到更改的影响,并且很难阅读。将两个数据集连接在一起,将以低错误率快速得到正确答案,即使是新手程序员也会明白这一点,并且总体上不会让人头痛。

示例#1435说明不应该存储数据(甚至元数据)的原因在宏变量中,除了直接使用外。@Joe:我正在修改一个我没有编写的宏的内部结构。这些列表是宏参数。不是我的选择,太好了。正如我所说,这些是我没有编写的宏中的参数。如果我是宏的原始作者,我会以不同的方式处理它。非常感谢,乔。非常感谢你的帮助。