我要将大约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;
运行;
答案 0 :(得分:1)
听起来好像您现有的代码已经完成了您需要它做的事情。我怀疑尝试在一个数据步骤中导入所有50个文件会有很大的性能提升(这可以通过dde进行,而是非常繁琐)。
如果您的现有代码设置为仅处理一个硬编码文件,我建议使用它来编写一个简单的宏,它将一个excel文件作为输入,导入该文件,并将其附加到主文件数据集。然后你可以调用宏50次。
e.g。您可以将宏编写为类似的内容,合并代码的所有相关位,并用宏变量替换对特定文件的所有引用:
%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)
答案 1 :(得分:0)
另一种方法是使用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);