将指定文件夹下的所有的excel文件导入到sas中
注:这种方法不止可以用来批量导入excel文件,也可以导入其它类型的文件,重要的是这里面的逻辑思想。
1. 指定需要导入的folder的路径,即需要导入文件的后缀
filename folder pipe "dir D:\home\data\files\*.xlsx /b";
2. 将指定文件夹下的所有的文件名(带文件后缀如:.xlsx)放入到data files中
data files;
length filename $100.;
infile folder truncover;
input filename $100.;
call symput("rows", _n_); * 导入了多少个文件,即data files中的行号;
run;
3. 后面如果需要合并数据集,这里需要先创建一个空的数据集
data all_data;
length var1 $30. var2 $5. var3 5. var4 6. var5 6.;
run;
4. 导入一个folder中所有的.xlsx文件
/* path 需要导入的.xlsx文件所在的文件夹路径;data 即上文中生成的数据集:file;rows 即:cll symput(“rows”, _n_);这里的宏变量 rows。 */
%macro importfiles(path, data, rows);
%do i=1 %to &rows.;
data _null_;
set &data.;
if _n_ = &i.;
* 将取出的文件名,赋值到macro变量file;
call symput("file", trim(filename));
* 因为sas data set不能使用中文命名,所以这里根据文件名的实际进行了重命名,需要根据实际需求更新;
call symput("outname", catt(substr(filename, 1,7), &i.));
run;
proc import datafile="&path.&file."
dbms = xlsx
out = &outname.
replace;
getnames = yes;
run;
* 以上是将文件夹中的所有.xlsx文件导入到SAS中,如果同时还需要将所有的数据合并到一个数据集中,可以使用以下方法;
* 如果是可以直接连接的数据;
data all_data; * all_data 在使用前一定是存在的,这个可以用一个data step创建一个空数据集;
set all_data &outname.; * 如果有where,这里where的作用范围只在最靠近的那个数据集,这里需要注意;
run;
*如果是需要合并的数据;
proc sort data=all_data out=sorted_all_data;
by var1 var2 var3;
run;
proc sort data=&outname. out=sorted_outname_data;
by var1 var2 var3;
run;
data all;
merge sorted_all_data sorted_outname_data;
by var1 var2 var3;
run;
%end;
%mend;
5. 使用
%importfiles(D:\home\data\files, file, &rows.);