SAS宏导出到csv

时间:2012-09-05 17:03:52

标签: macros sas

我正在尝试使用此处的代码而不确定如何正确调整它。 https://communities.sas.com/thread/33654?start=0&tstart=0

我正在尝试将51个SAS数据集导出为CSV文件,以便我可以将它们导入R.这是我的宏代码(不起作用):

libname g 'C:\mylibrary';
%macro export(libname, numvars= &numvars.);
  %do i= 1 %to &numvars.;
    proc export data=&libname.StateZip&i
      DBMS=CSV REPLACE 
      outfile= "&libname.StateZip&i.csv"; 
      run;
  %end;
%mend;

%export(&g, numvars= 51);

以下是我收到的错误消息:

NOTE: Writing TAGSETS.SASREPORT12(EGSR) Body file: EGSR
13         
14         GOPTIONS ACCESSIBLE;
ERROR: Invalid macro name (.  It should be a valid SAS identifier no longer than 32 characters.
ERROR: A dummy macro will be compiled.
15         %macro export(libname, numvars= &numvars.);
16          %do i= 1 %to &numvars.;
17              proc export data=&libname.StateZip&i
18                  DBMS=CSV REPLACE
19               outfile= '&libname.StateZip&i.csv';
20               run;
21          %end;
22         %mend;
23         
24         %export(g, numvars= 51);
24        +(libname, numvars= &numvars.);
           _
           10

ERROR 10-205: Expecting the name of the procedure to be executed.

24        +(libname, numvars= &numvars.);
           _
           180
ERROR 180-322: Statement is not valid or it is used out of proper order.
2                                           The SAS System          11:38 Wednesday, September 5, 2012



180: LINE and COLUMN cannot be determined.
NOTE: NOSPOOL is on. Rerunning with OPTION SPOOL may allow recovery of the LINE and COLUMN where the 
      error has occurred.

您可以提供任何帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:2)

你有一个对& numvars的递归引用,这本身就是一个问题,但不是一个关键问题 - 只是意味着默认值为null,而不是你想要的值。否则你的代码对我来说很好。在%宏定义之前,我猜你还有其他问题;你发布的错误使你看起来有一个不正确解析的令牌,所以而不是 %宏导出(

你有 %macro(

无论如何,这对我有用:

%let g=c:\temp;
libname g "&g.";
%macro export(libname, numvars=);
  %do i= 1 %to &numvars.;
    proc export data=sashelp.class
      DBMS=CSV REPLACE 
      outfile= "&g.\StateZip&i.csv"; 
      run;
  %end;
%mend;

%export(&g, numvars= 51);

我改变的事情: *你需要一个%let g =与你的libname一起使用。你没有定义,但可能你在其他地方。 * Sashelp.class而不是使用你的库,因为我没有这些数据集。

但更好的答案可能是这样做,使用FILEVAR选项并自己编写。即使您有大量变量,也可以通过编程方式确定put语句,或者只从日志中执行一次proc导出和复制。这避免了所有宏的东西,并避免你必须制作51个不同的数据集。只需使用指标变量制作一个。几乎不管你在做什么,这都会更快(使用带有PRO的BY组处理等),并且比使用一堆不同的数据集并用宏来弥补它更容易出错。

data have_51;
set sashelp.class;
do _n = 1 to 51;
output;
end;
run;

*I assume you have have_51 already;

data want;
set have_51;
filename=cats("&g.\StateZip",_n,".csv");
run;

proc sort data=want;
by filename;
run;

data _null_;
set want;
file a filevar=filename dlm=',' lrecl=500;
put
name $
age
height
weight
;
run;