如何在SAS数据集中使用SAS宏

时间:2013-07-18 03:30:19

标签: sas

我想在数据步骤中使用宏调用。下面是宏及其在数据步骤中的调用,但这不起作用。你们可以建议一种让它发挥作用的方法。

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

2 个答案:

答案 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.pdfhttp://www2.sas.com/proceedings/sugi22/CODERS/PAPER70.PDF