Macros SAS:将格式放入宏中
我试图通过为现有变量指定格式来创建一个新变量。我在宏中执行此操作。我得到了以下错误:“:需要一个格式名。”有没有关于如何解决的想法?谢谢Macros SAS:将格式放入宏中,macros,sas,Macros,Sas,我试图通过为现有变量指定格式来创建一个新变量。我在宏中执行此操作。我得到了以下错误:“:需要一个格式名。”有没有关于如何解决的想法?谢谢 /* macro to loop thru a list of vars and execute a code block on each. This is working fine. */ %macro iterlist ( code = ,list = ) ; %*** ASSIGN EACH ITEM IN THE
/* macro to loop thru a list of vars and execute a code block on each. This is working fine. */
%macro iterlist
(
code =
,list =
)
;
%*** ASSIGN EACH ITEM IN THE LIST TO AN INDEXED MACRO VARIABLE &&ITEM&I ;
%let i = 1;
%do %while (%cmpres(%scan(&list., &i.)) ne );
%let item&i. = %cmpres(%scan(&list., &i.));
%let i = %eval((&i. + 1);
%end;
%*** STORE THE COUNT OF THE NUMBER OF ITEMS IN A MACRO VARIABLE: &CNTITEM;
%let cntitem = %eval((&i. - 1);
%*** EXPRESS CODE, REPLACING TOKENS WITH ELEMENTS OF THE LIST, IN SEQUENCE;
%do i = 1 %to &cntitem.;
%let codeprp = %qsysfunc(tranwrd(&code.,?,%nrstr(&&item&i..)));
%unquote(&codeprp.)
%end;
%mend iterlist;
/* set the list of variables to iterate thru */
%let mylist = v1 v2 v3 v4;
/* create a contents table to look up format info to assign in macro below*/
proc contents data=a.recode1 noprint out=contents;
run;
/* macro to create freq and chisq tables for each var */
%macro runfreqs (variabl = );
proc freq data=a.recode1 noprint ;
tables &variabl.*improved /out=&variabl._1 chisq;
output out=&variabl.chisq n pchi ;
run;
/* do some more stuff with the freq tables, then grab format for variable from contents */
data _null_;
set contents;
if name="&variabl." then CALL SYMPUT("classformat", format);
run;
data &variabl._3;
length classvalue $ 30 ;
set &variabl._2; ;
/* output a new var using the macro variable for format that we pulled from contents above. Here's where the error occurs. */
classvalue=put(class, %quote(&classformat.));
run;
%mend runfreqs;
* run the macro, iterating thru var list and creating freq tables;
%ITERLIST(list = &mylist., code = %nrstr(%runfreqs(variabl = ?);));
猜猜看,电话线
classvalue=put(class, %quote(&classformat.));
应该是
classvalue=put(class, &classformat..);
两点因为一个被宏处理器“吃掉”以标记宏变量名称的末尾,所以需要第二个来完成格式名称。
我相信在您的案例中不需要%quote()
——格式名称不能包含%quote()
引用的字符串
编辑:再次没有尝试,只是根据我看到的代码,您还需要更改调用SYMPUT(“classformat”,format)代码>
调用SYMPUTX(“classformat”,format)代码>
CALL SYMPUTX()是CALL SYMPUT()的高级版本,它删除宏变量value中的尾随空格,而原始版本保留空格。实际上,这与您的解决方案相同,只是更简单。
因此,问题确实在于格式名称和句点之间有额外的空格。不知道为什么这样做有效,而vasja的想法不会,但问题显然在于格式名称末尾的句点(或者可能有额外的空白?)。我更改了数据步骤以添加SYMPUT调用之前的时段:
data _null_;
set contents;
myformat=catt(format,'.');
if name="&variabl." then CALL SYMPUT("classformat", myformat);
run;
请修改您的问题,以显示说明您问题的完整宏。它不需要是您正在处理的整个宏,只需要一个简单的示例来说明您正在做什么。我们需要看一个变量&variabl的例子,以及内容中有多少OB。欢迎来到StackOverflow!谢谢你的主意。就这样试了一下,也犯了同样的错误。看起来&classformat被初始化为我要查找的格式名称,但它可能没有在末尾拾取额外的点?