【问题标题】:SAS: export data to multiple csv file by yearSAS:按年将数据导出到多个 csv 文件
【发布时间】:2015-04-01 23:20:49
【问题描述】:

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

这是我一年来正在做的事情(这很天真):

过程导出
data=ds (where=(year=2011)) outfile='ds2011.csv' DBMS=CSV 替换;
运行;

非常感谢!

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    这将是 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”。

    您可以在 SAS 中打开以下选项以帮助进行宏调试和可视化,请查看 SAS 文档了解更多信息:

    SYMBOLGEN
    MLOGIC
    MPRINT
    

    【讨论】:

      【解决方案2】:

      非宏选项:

      您可以在数据步骤中使用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;
      

      【讨论】:

      • 另外值得注意的是,对于大型数据集,这种方法比宏版本更有效,因为它只需读取一次输入数据集(而不是每年一次)。
      • put _all_; 产生命名输出(例如“year=2010”),并在输出中包含 fv 的值,以及其他自动变量 _N__ERROR_。它也不输出分隔符。避免这种情况的方法是使用:put (_all_) (:);。在这里,SAS 将只打印变量的值,不包括自动变量。我编辑了答案以反映这个更清洁的解决方案。
      • 那么格式怎么样了?例如,是否会保留日期时间格式?
      • 在这种情况下,没有指定格式,因此data 步骤使用与数据集中的变量关联的任何格式写入 csv。如果您在数据集中有一个格式为datetime21.2 的变量,它将在csv 文件中使用datetime21.2 格式写入。
      • 此代码有效,但导出文件中没有任何标题或列名。
      【解决方案3】:

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

      %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);
      

      这有点复杂,但可以使用。每个变量都包含三个信息,@是变量的位置,第二是变量的名称,最后是变量的格式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-14
        • 2015-10-06
        相关资源
        最近更新 更多