为什么在使用%str()屏蔽时%扫描失败?

时间:2013-07-01 04:23:44

标签: macros sas

我正在尝试编写一个宏,该宏将接受由|分隔的一串变量名称,并对它们执行计算(例如ab dc|def)。我尝试了以下代码,但是我在扫描函数上遇到了一个奇怪的错误:“宏函数%SCAN的参数太少了。”

SYMBOLGEN告诉我&from.&k.已正确解决:“从解析到ab dc | def”和“K解析为1”所以我不知道是什么问题是。最初我怀疑%str()屏蔽了值,直到宏执行时间之后,导致参数无法解析。但事实并非如此,因为%unquote(%str(..scan function..))给出了同样的错误。

%macro data_mapping_sum(from);
  %let k=1;
  %let temp_ind = "%scan(&from., &k.,"|")";
  %let THIS_FAILS = %str(%'%scan(&from., &k.,"|")%'n); 

  %do %while( (&temp_ind. NE "") );
      %unquote(&THIS_FAILS.) = 999; 
      %let k = %eval(&k. + 1);
      %let temp_ind = "%scan(&from., &k.,"|")";
      %let THIS_FAILS = %str(%'%scan(&from., &k.,"|")%'n);
  %end;

%mend;

data test;
%data_mapping_sum(ab dc|def);
run;

2 个答案:

答案 0 :(得分:0)

宏功能不需要引号。这似乎有用......作为一个开始

%macro data_mapping_sum(from);
 %let k=1;

 %do %while (%scan(&from,&k,|)^=%str());
  %let temp_ind = %scan(&from, &k,|);
  %Put temp_ind(&k)= &temp_ind;
  %let k = %eval(&k. + 1);
 %end;

%mend;

%data_mapping_sum(ab dc|def);

答案 1 :(得分:0)

我会打开这个问题,因为我认为我没有完全回答我自己的问题。但是,如果任何人需要具有类似功能的程序,我的工作代码是:

%macro data_mapping_sum(from, map_to);

  %let k=1;
  %let temp_ind1 = %scan(&from., &k.,"|");
  %let temp_ind2 = %scan(&map_to., &k.,"|");
  %do %while( ("&temp_ind1." NE "") AND ("&temp_ind2." NE "") AND &k. NE 1000);
      %unquote(%str(%'&temp_ind2.%'n)) = sum(%unquote(%str(%'&temp_ind2.%'n)),%unquote(%str(%'TRAN_&temp_ind1.%'n)));   
      %let k = %eval(&k. + 1);
      %let temp_ind1 = %scan(&from., &k.,"|");
      %let temp_ind2 = %scan(&map_to., &k.,"|");
  %end;
%mend;

data test;
a="%data_mapping_sum(abc d|f,ter|te cy)";
run;

我希望它有用。