我正在尝试编写一个宏,该宏将接受由|
分隔的一串变量名称,并对它们执行计算(例如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;
答案 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;
我希望它有用。