【发布时间】: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