我在名为&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
。但是, 是一个更简单,更优雅的解决方案。
有什么想法吗?
答案 0 :(得分:1)
对于你说的问题,没有一个好的解决方案。有些杂乱的东西(比你提供的杂乱得多,我认为它非常混乱)。 Perl正则表达式可能是你最好的选择。
最终,正确的答案是从数据集中解决这个问题。这是否意味着您使用宏变量(凌乱,确定)创建数据集,或者将其存储在数据集的第一位,并为各种目的(正确的方法)提取所需的部分,这是最佳解决方案。像这样的宏代码是混乱的,容易出错,容易受到更改的伤害,并且难以阅读。将两个数据集相互连接可以很快得到正确的答案并且错误率很低,即使对于一个相当新手的程序员来说也是显而易见的,并且总体上不那么令人头痛。