我想在数据步骤中使用宏调用。下面是宏及其在数据步骤中的调用,但这不起作用。你们可以建议一种让它发挥作用的方法。
%macro xscan(string, delimiter, word_number);
%let len1=%length(&string); /*Computing the length of the string*/
%let len=%eval(&len1+1);
%let sub=%scan(&string,&word_number,"&delimiter");
%if &word_number ge 0 %then %do;
%let pos=%index(&string,&sub); /* Locate the position while reading left to right*/
%end;
%if &word_number lt 0 %then %do;
data _null_;
pos=find("&string","&sub",-&len);
call symput("pos",pos);
run;
%end;
%let strg=%substr(&string,&pos); /* Extract the substring*/
%put the string is &strg;
%mend;
data work.in_data;
length in_string $50;
in_string = “a bb ccc dddd bb eeeee”;
output;
in_string = “aa b cc aa dee”;
output;
run;
data work.out_data;
set work.in_data;
length sub_str $50;
start_word_num = -(_n_ +1);
sub_str = %xscan(in_string,’ ‘, start_word_num);
run;
proc print; run;
答案 0 :(得分:2)
如果要在datastep中使用宏,只需使用datastep函数就可以更简单地编写它,而不是使宏函数变得复杂。有很多SAS字符串函数可以让你以更少的代码完成你想要的东西。
答案 1 :(得分:0)
数据步骤非常灵活,它们允许您在非常灵活的一天中操作数据,我建议您尝试重构代码以仅使用datastep,但是,如果您仍然希望以您拥有的方式使用它它现在使用call execute
。
这是一个例子:
data _null_ ;
input name $ value !$ ;
call execute
( ‘%global ‘
llname~l ‘;’ II
‘%let’ Ilnamell =’ [1
value II ‘;’
);
cards ;
abc xyz
;
请参阅这些文档以进一步阅读: http://www2.sas.com/proceedings/sugi30/154-30.pdf和 http://www2.sas.com/proceedings/sugi22/CODERS/PAPER70.PDF