2

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

SYMBOLGEN告诉我&from.&k.正确解决:“FROM 解析为 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;
4

2 回答 2

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);
于 2013-07-01T14:59:33.203 回答
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;

我希望它会有所帮助。

于 2013-07-02T02:09:30.980 回答