SAS:按年将数据导出到多个csv文件

时间:2015-02-02 21:52:22

标签: sas sas-macro

我在SAS中有一个数据集,其中包含20年的数据。我想每年导出到csv文件。有没有简单的方法呢?

这是我现在正在做的一年(这是天真的):

proc export    data = ds(where =(year = 2011))outfile ='ds2011.csv'DBMS = CSV替换;
运行;

非常感谢!

3 个答案:

答案 0 :(得分:7)

非宏选项:

您可以在数据步骤中使用file语句来写出各种类型的文本或分隔文件。使用filevar选项可以为变量的每个值创建一个文件,如下所示。

yourdata替换为您的数据集,将write_location替换为您希望文件的位置。

data _null_;
  set yourdata;
  length fv $ 200;
  fv = "\write_location\" || TRIM(put(year,4.)) || ".csv";
  file write filevar=fv dsd dlm=',' lrecl=32000 ;
  put (_all_) (:);
run;

答案 1 :(得分:2)

这对于SAS / Macro来说是理想的工作,它允许将文本替换为重复的代码。请参阅下面的解决方案(假设日期范围为1991-2011,更改%let语句以适合您的范围),并使用宏%do循环替换& dt的值。 (1991-2011)进入你问题中提供的代码。

%macro date_export;
%let start_date = 1991;
%let end_date = 2011;

%do dt=&start_date %to &end_date;
  proc export
  data=ds (where=(year=&dt.)) outfile="ds&dt..csv" DBMS=CSV replace;
  run;
%end;
%mend date_export;

%date_export

date_export宏在%macro%mend语句之间定义。首先,日期范围被定义为两个宏变量(这可以省略,变量直接插入%do语句,但为了清楚起见,这里说明了这一点。 %do语句以循环开始,dt宏变量介于start_dateend_date之间。这可以改写为:

%do dt=1991 %to 2011;

并且省略了最初的两个%let语句。

循环运行%do%end之间的所有代码,在找到dt时替换&dt.的值。

导出代码

确保proc export在宏循环中正确运行需要进行一些微妙的更改,

  1. 首先,最明显的是,我已将&dt.的年份替换为将dt的值传递到您的代码中。

  2. 请注意,当放置在.csv旁边时,需要额外的一段时间(第一个句点会以dt结算,只留下一个句点而后面会csv

  3. 您的问题中的单引号需要替换为双引号,以便宏将解析。否则,生成的文件将按字面意思调用' ds& dt..csv'。

  4. 您可以在SAS中打开以下选项以协助进行宏调试和可视化,查看SAS文档以获取更多信息:

    SYMBOLGEN
    MLOGIC
    MPRINT
    

答案 2 :(得分:0)

我们没有许可进出口程序,所以我们必须使用另一种方法:

%macro xprtDT(dt=,strt=,nd=);
    %do i=&strt %to &nd;
        filename myfile "C:\&dt&i..csv";
        data _null_;
        set &dt;
        file myfile;
        put 
           @1 var1 z6. 
           @7 ' ' 
           @8 var2 z6. 
           ' '
           ...
           @22 varn;
        run;
    %end;
%mend;
%xprtDT(datadile,1991,2011);

这有点复杂,但可以使用。在变量second的位置是变量的名称后,每个变量包含三元组的信息,最后是变量的格式。