-2

我想在数据步骤中使用宏调用。下面是宏及其在数据步骤中的调用,但这不起作用。你们能建议一种使它工作的方法吗?

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

2 回答 2

2

如果要在 datastep 中使用宏,请仅使用 datastep 函数更简单地编写它,而不是使用宏函数使其变得复杂。有很多 SAS 字符串函数可以让你用更少的代码完成你想要的。

于 2013-07-18T08:06:11.030 回答
0

数据步骤非常灵活,它们允许您在非常灵活的一天内操作数据,我建议您尝试重构代码以仅使用数据步骤,但是,如果您仍想以现在的方式使用它使用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

于 2013-07-18T13:38:43.813 回答