代码来自宏执行

时间:2017-01-27 09:05:04

标签: sas sas-macro

为了创建一个复杂的分析,我有一个程序,它将包含一些不同的其他程序,每个程序都有一个特定的目的(主要是每个分析一个,一个用于宏,一个用于格式等等)。只需点击最终程序,所有分析都可顺利进行。

基本上我现在想要的是实现一个能够重写一个文档中所有代码的系统:用正确的代码爆炸宏,用正确的datastep代码爆炸%do循环,删除%let语句但解析宏变量,等等(例如在帖子的底部)。

我唯一的想法是保存日志,使用MPRINT选项编写所有内容,删除datastep执行后的注释以及其他与datastep无关的内容。但是这种方法真的很脏,所以我很乐意问你是否对如何进行有了更好的想法。

这是两个嵌套程序的示例:

main.sas

-----------------------------------------------------

/* My MAIN PROGRAM */

%let PGM=MAIN;
%put This is my &pgm. program;

%let LIB=MYLIB;

%include &LIB.(FIRST.sas);

-----------------------------------------------------

first.sas

-----------------------------------------------------

%let ind=2;

%macro ABC;
%do rk=1 %to &ind.;

data A&rk.;
MYVAR=&rk.; output;
run;

%end;
%mend; %ABC;

-----------------------------------------------------

我会得到的文件是:

/* My MAIN PROGRAM */

%put This is my MAIN program;

data A1;
MYVAR=1; output;
run;

data A2;
MYVAR=2; output;
run;

有什么建议吗?你有没有发现这个?你怎么解决的?非常感谢。

1 个答案:

答案 0 :(得分:0)

见这里的例2:

http://support.sas.com/documentation/cdl/en/mcrolref/69726/HTML/default/viewer.htm#p1dhqw0i5yj2m8n15opapnwteqra.htm

您可以将这些选项添加到您的程序中:

options mfile mprint;
filename mprint 'debugmac';

所有生成的代码都将出现在指定的输出文件中。这将包含%PUT语句 - 在您的示例中,您所需的输出包含%PUT语句。上面的选项只是将所有正常MPRINT行重定向到文件,因此不包含开放代码或宏语句。您可以找到一种方法将标题附加到MPRINT文件,具体取决于您的确切需求。

说了这么多,我不推荐你的做法。你为什么要用这种方式压扁程序?它不太可能有任何明显的性能优势,并且将来会更难调试或修改程序。