【问题标题】:Remove exact word from a list of similar words in SAS从 SAS 中的相似词列表中删除确切的词
【发布时间】:2014-07-22 23:33:22
【问题描述】:

我有一个名为&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。然而,必须有一个更简单、更优雅的解决方案。

有什么想法吗?

【问题讨论】:

  • Example #1435 为什么不应该将数据(甚至元数据)存储在宏变量中,除非直接使用。
  • @Joe:我正在修改我没有编写的宏的内部结构。这些列表是宏参数。不是我的选择。

标签: sas


【解决方案1】:

对于您所说的问题,没有一个好的解决方案。有一些乱七八糟的(比你提供的更乱,我认为这很乱)。 Perl 正则表达式可能是你最好的选择。

最终,正确的答案是从数据集中找出答案。这是否意味着您使用宏变量创建数据集(肯定是混乱的),或者首先将其存储在数据集中并取出您需要用于各种目的的部分(正确的方法),这是最好的解决方案。像这样的宏代码很混乱,容易出错,很容易被更改损坏,并且难以阅读。将两个数据集相互连接起来可以很快得到正确的答案,而且错误率很低,即使是相当新手的程序员也很明显,而且总体上不会那么令人头疼。

【讨论】:

  • 优秀。正如我所说,这些是我没有编写的宏中的参数。如果我是宏的原始作者,我会以不同的方式处理它。非常感谢,乔。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 2018-09-28
  • 2021-12-29
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多