%macro importdata(dirname,typ); /*参数有三个个:路径,文件类型后缀*/
/*模块1--------------------------------【获取文件名】--------------------*/
%put %str(----------->dirname=&dirname) ;
%put %str(----------->typ=&typ) ;
data temp_filename ;
rc=filename("dir","&dirname") ;/*把&dirname值传给文件引用符“dir"*/
openfile=dopen("dir") ;/*得到路径标示符openfile,dopen是打开directory的sas内置函数*/
if openfile>0 then do ;/*如果openfile>0表示正确打开路径*/
nummem=dnum(openfile) ;/*得到路径标示符openfile中member的个数nummem,即指定目录下文件个数*/
do ii=1 to nummem ;
name=dread(openfile,ii) ;/*用dread依次读取每个文件的名字到name*/
output ;/*依次输出*/
end ;
end ;
/* keep name ;*/
/*只保留name列*/
run ;
proc sort data = temp_filename ;/*按照name排序*/
by descending name ;
%if &typ^=all %then %do ;/*是否过滤特定的文件类型&typ*/
where index(upcase(name),upcase(".&typ"));/*y,则通过检索name是否包含&typ的方式过滤文件类型*/
%end ;
run ;
/*-模块2-------------------------【将文件名存为宏变量】----------------*/
%local N;
proc sql noprint;
select count(*) as cnt into:N
from temp_filename ;
quit;
/* 获取观测行数,也即导入的数据文件个数*/
data _null_;
set temp_filename ;
call symputx('y'||left(_n_),name);
run;
/* 将文件名逐个存为临时宏变量*/
%do i = 1 %to &N;
%local filenamelist;
%let filenamelist = &filenamelist. &&y&i ;/*对临时宏变量,对各文件名进行连接,各文件名以空格隔开*/
%end;
%put &filenamelist;
/*-模块3-------------------------【开始批量导入】----------------*/
%do j = 1 %to &N ;
%let var&j = %sysfunc(trim(%scan(&filenamelist,&j,' ')));
%put &&var&j;
/* 数据导入-PS:这里以导入txt为例,tab分割,如导入excel需要修改为xls,附加dbms=xls*/
PROC IMPORT OUT= temp&j
DATAFILE= "&dirname.&&var&j"
DBMS=TAB REPLACE;
GETNAMES=YES;
DATAROW=2;
RUN;
%end;
/*如果是同类型的表,则进行数据合并,根据需要而定*/
data merge_temp;
set
%do j = 1 %to &N;
temp&j
%end;
;
run;
%mend;