Macros 为什么用%str()屏蔽时%scan失败?

Macros 为什么用%str()屏蔽时%scan失败?,macros,sas,Macros,Sas,我正在尝试编写一个宏,该宏将接收由|分隔的变量名字符串,并对其执行计算(例如ab dc | def)。我尝试了以下代码,但扫描函数出现了一个奇怪的错误:“宏函数%scan的参数太少。” SYMBOLGEN告诉我&from.和&k.已正确解决:“from resolves to ab dc | def”和“k resolves to 1”,因此我不确定问题出在哪里。最初我怀疑%str()在宏执行时间之后才屏蔽该值,导致参数无法解析。但情况似乎并非如此,因为%unquote(%str(…scan f

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

SYMBOLGEN
告诉我
&from.
&k.
已正确解决:“from resolves to ab dc | def”和“k resolves to 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;

宏函数不需要引号。这似乎奏效了……作为一个开始

%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);

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

%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;

我希望这会有帮助。

p.s.如果有人感兴趣,我已经用另一种方式编程了。如果你想看的话,请一定要让我知道。请随意发布你的解决方案作为答案。堆栈溢出。当然,我会在这里发布之前清理我的代码。你好,卡罗莱纳,谢谢你的回答。我之所以需要引号,是因为我扫描的字符串中可能有空格。因此,需要%str()来屏蔽%'和%'n:%str(%'..scan function..%'n)有望解析为'..name..'n'