0

我正在尝试使用此处的代码,但不确定如何正确调整它。 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.

您可以提供的任何帮助将不胜感激。

4

1 回答 1

2

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

你有 %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 个不同的数据集。只需制作一个,带有指示变量。几乎无论您在做什么,这都会比拥有一堆不同的数据集并使用宏来弥补它更快(使用带有 PROC 的 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;
于 2012-09-05T17:15:22.827 回答