【问题标题】:How to write macro for importing multiple excel files(xlsx) in sas and append it如何编写宏以在sas中导入多个excel文件(xlsx)并附加它
【发布时间】:2015-01-01 09:45:01
【问题描述】:

我有大约 50 个 excel 文件(xlsx 格式)要导入到 sas,然后需要附加以进行分析。所有 excel 文件的标题都是相同的,即所有文件的变量名都相同。我需要宏来一次导入和附加所有文件,而不是一个接一个地导入所有文件,然后再附加它。非常感谢您的帮助。

excel 文件的另一个问题是变量名和数据点之间有一个空白列。我已经编写了一个使用数据步骤删除它的代码,但是我们在导入时也在宏中编写了它。

Data  XXX.yyy;
  Set XXX.yyy;
    if missing(coalesceC(of ASC Brand Cdesc1 Cust_ DGM Desc Family Grp1 High_Level_Product_Desc 
    Issf Name Prod_Desc Product__Code RVP SA_Desc Terr_ UOM Yr 
    )) and missing(coalesce(of Acc Int_Margin M_Cost Mth Net_Sales Sls__ Uts )) then delete;

运行;

【问题讨论】:

    标签: import sas sas-macro


    【解决方案1】:

    听起来好像您现有的代码已经完成了您需要它做的事情。我怀疑尝试在一个数据步骤中导入所有 50 个文件会大大提高性能(这可以通过dde 实现,但相当繁琐)。

    如果您现有的代码设置为仅处理一个硬编码文件,我建议使用它来编写一个简单的宏,该宏将一个 Excel 文件作为输入,导入该文件,并将其附加到主数据集。然后你可以调用宏 50 次。

    例如您可以像这样编写宏,合并代码的所有相关位,并用宏变量替换对特定文件的所有引用:

    %macro import_and_append(excel_file,base_dataset);
      proc import datafile = "&excel_file" dbms = excel out = t_import;
      run;
    
      proc append base = &base_dataset data = t_import;
      run;
    
      proc datasets lib = work nolist nowarn;
        delete t_import;
        run; 
      quit;
    %mend;
    

    然后你可以像这样调用宏:

    %import_and_append(c:\excel_file_01.xls,work.master_dataset)
    

    【讨论】:

    • 是的,我已经完成了导入,但我仍然可以处理 50 个文件,所以我必须多次重复该步骤,所以我想编写一个宏。但是我是 sas 的新手,一个月前才开始学习,所以我对宏非常不擅长,所以任何这样做的代码都会有所帮助。
    • 我为您添加了一个示例,以便您了解基本语法的样子。您应该能够调整现有代码以类似的方式运行。
    【解决方案2】:

    另一种方法是使用 Excel LIBNAME 引擎。您为每个文件声明一个库,然后在 1 Data Step 中读取所有工作表。

    在此示例中,我在 C:\temp 中有 2 个工作簿(Book1.xlsx 和 Book2.xlsx)。所有数据都在 Sheet1 中。 3 个变量——X、Y 和 Z。根据需要进行修改。

    data files;
    format file $12.;
    input file $;
    datalines;
    Book1.xlsx
    Book2.xlsx
    ;
    run;
    
    %macro read_excel(dir,outdata,files);
       data _null_;
       set &files end=last;
    
       call execute("libname t" || strip(put(_n_,8.)) || " excel '&dir\" || strip(file) || "';");
    
       if last then
           call symput("n",_n_);
       run;
    
       data &outdata;
       set 
       %do i=1 %to &n;
           t&i.."Sheet1$"n
       %end;
       ;
    
       a = sum(x,y,z);
       if missing(a) then delete;
       run;
    
       %do i=1 %to &n;
          libname t&i clear;
       %end;
    %mend;
    
    %read_excel(c:\temp,data_from_excel,files);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多