宏中的数据线中的SAS宏变量

时间:2017-09-01 13:41:29

标签: sas

我的问题如下 - 我有这段代码可以正常工作,并将保存到宏变量中的字符添加到表中:

%let year=2015;
data example;
input year $40.;
years=dequote(resolve(quote(year)));
datalines;
&year
;
run;

输出: enter image description here

现在我想在宏中做同样的事情,代码如下:

  %macro pokus();
  %let year=2015;
  data example;
  input year $40.;
  years=dequote(resolve(quote(year)));
  datalines;
  &year
  ;
  run;
  %mend pokus;
  %pokus;

但是我收到了一条错误消息: enter image description here

为什么会这样?有一些简单的方法如何将宏变量添加到宏内的表中? 我需要它来执行这种类型的循环:

 %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表中。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您要么不解释某些重要细节,要么以极其复杂的方式执行此操作,这完全没有必要。

您的问题的直接答案在错误消息中:CARDSDATALINES语句不能在宏中使用。

但解决方案是你不应该以这种方式使用数据线。这不是将宏变量放入数据集的正确方法。

%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)
...