全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1947 4
2015-08-07

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

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-8-7 10:15:34
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-8-7 12:11:20
发帖时可以用代码形式发布。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-8-7 16:59:21
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-8-7 21:34:16
Have you tested it by yourself?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群