我的问题如下 - 我有这段代码可以正常工作,并将保存到宏变量中的字符添加到表中:
%let year=2015;
data example;
input year $40.;
years=dequote(resolve(quote(year)));
datalines;
&year
;
run;
现在我想在宏中做同样的事情,代码如下:
%macro pokus();
%let year=2015;
data example;
input year $40.;
years=dequote(resolve(quote(year)));
datalines;
&year
;
run;
%mend pokus;
%pokus;
为什么会这样?有一些简单的方法如何将宏变量添加到宏内的表中? 我需要它来执行这种类型的循环:
%macro pokus();
%do i=2015 %to 2017;
%let year=&i.;
data example;
input year $40.;
years=dequote(resolve(quote(year)));
datalines;
&year
;
run;
....additional code .....
%end;
%mend pokus;
%pokus;
补充说明 - 这是继续以这种方式进行的更复杂运动的一部分:
data z;
length roky mesic mesic2 saz $100;
input roky mesic mesic2 saz;
datalines;
2012 01 1 k
2012 02 2 h
2012 03 3 j
2012 04 4 x
2012 05 5 l
2012 06 6 m
;
run;
proc sql;
select count (*) into: pocet from z;
quit;
%macro rok();
%do i=1 %to &pocet;
data _null_;
set z (obs= &i);
call symputx("roky",roky);
call symputx("mesic",mesic);
call symputx("mesic2",mesic);
call symputx("saz",saz);
run;
...... additional code .....
%end;
%mend rok;
%rok;
现在我想让它变得动态,即首先用列" roky"来计算所有内容。具有2012年的价值,比2013,2014,e.t.c。但是我无法在这个结构之上构建另一个宏来改变这个列" roky"在z表中。
感谢您的帮助。
答案 0 :(得分:3)
您要么不解释某些重要细节,要么以极其复杂的方式执行此操作,这完全没有必要。
您的问题的直接答案在错误消息中:CARDS
或DATALINES
语句不能在宏中使用。
但解决方案是你不应该以这种方式使用数据线。这不是将宏变量放入数据集的正确方法。
%let year=2015;
data example;
years=&year.;
run;
更容易,不是吗?这在宏观上是否正常。
如果您从提示或其他内容中获取此宏变量,则可能需要%unquote(&year)
,但您仍可以在原位执行此操作。
data example;
years = %unquote(&year.);
run;
答案 1 :(得分:0)
您尚未解释为何需要使用内联数据。这是宏内部无法做到的。
如果只是这样你可以把字符串'& year'变成字符变量那么为什么不只是使用赋值语句?确保使用单引号,以便宏处理器在编译数据步骤之前不会解析& year。
那么你的第一个数据步骤可能会是这样的。
%let year=2015;
data example;
year='&year';
years=dequote(resolve(quote(year)));
run;
当然,如果您只想检索单个宏变量的值,则更容易使用SYMGET()函数。
%let year=2015;
data example;
years=symget('year');
run;
您的问题的其余部分看起来像是想要从元数据表中的数据驱动宏?已经有类似的问题。一种解决方案是定义宏以使用参数,并使用CALL EXECUTE()为元数据表中的每一行生成一个宏调用。所以像这样:
data _null_;
set z ;
call execute(cats('%nrstr(%rok)('
,'roky=',roky
,'mesic=',mesic
,'mesic2=',mesic2
,'saz=',saz
,')'
));
run;
将生成如下调用:
%rok(roky=2012,mesic=01,mesic2=1,saz=k)
%rok(roky=2012,mesic=02,mesic2=2,saz=h)
...