【问题标题】:SAS Macro to export to csv要导出到 csv 的 SAS 宏
【发布时间】:2012-09-05 17:03:51
【问题描述】:

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

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

【问题讨论】:

    标签: macros sas


    【解决方案1】:

    您有一个对 &numvars 的递归引用,这本身就是一个问题,但不是一个关键问题 - 只是意味着默认值将为空,而不是您想要的值。否则你的代码对我来说很好。我猜你在 %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;
    

    【讨论】:

    • 很好,但您确定dlm=','proc export 在生成CSV 的方式上相同吗?如何处理引号、逗号等?
    • Joe,您的 cmets 删除了我遇到的错误。但是,我现在得到了一个不同的:code 26 \\smpsasp02\gsas\DM2\Alex\2012-09 IDP Maps - MemberSegments\StateZip Datasets\StateZip1 _ 22 76 ERROR 22-322: Expecting a name. ERROR 76-322: Syntax error, statement will be ignored.
    • Rob - PROC EXPORT 生成看起来像那样的代码并运行它。在 PROC EXPORTing a CSV 后查看日志。我不允许在生产代码中将 PROC IMPORT 或 PROC EXPORT 与 CSV 一起使用,除非有非常好的理由,因为您始终可以使用数据步骤编写代码,并获得更可预测的结果。 PROC IMPORT 或 EXPORT 做出有关格式等的决定,并且您的代码永远不应将这些决定留给 SAS :) 由于 PROC EXPORT/IMPORT 将其代码写入日志,您始终可以编写 PROC EXPORT/IMPORT 然后从记录。
    • 只是一个快速提示,而不是在运行 PROC EXPORT 后从日志中复制,只需在编辑器窗口中按 F4 即可调用最后提交的代码!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多