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

时间:2014-06-02 19:05:00

标签: sas

我在名为&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,但由于调用1 2 3而产生TRANWRD

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

对于你说的问题,没有一个好的解决方案。有些杂乱的东西(比你提供的杂乱得多,我认为它非常混乱)。 Perl正则表达式可能是你最好的选择。

最终,正确的答案是从数据集中解决这个问题。这是否意味着您使用宏变量(凌乱,确定)创建数据集,或者将其存储在数据集的第一位,并为各种目的(正确的方法)提取所需的部分,这是最佳解决方案。像这样的宏代码是混乱的,容易出错,容易受到更改的伤害,并且难以阅读。将两个数据集相互连接可以很快得到正确的答案并且错误率很低,即使对于一个相当新手的程序员来说也是显而易见的,并且总体上不那么令人头痛。