楼主: 汪政元
1983 4

[程序分享] 【信用评分之数据批量导入】——基于文件夹路径、文件类型 [推广有奖]

  • 3关注
  • 7粉丝

已卖:352份资源

硕士生

74%

还不是VIP/贵宾

-

威望
0
论坛币
122 个
通用积分
5.1500
学术水平
12 点
热心指数
16 点
信用等级
8 点
经验
755 点
帖子
77
精华
0
在线时间
259 小时
注册时间
2012-10-14
最后登录
2024-2-3

楼主
汪政元 在职认证  发表于 2015-8-7 10:07:54 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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

二维码

扫码加我 拉你入群

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

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

关键词:信用评分 批量导入 文件夹 directory filename 文件夹

沙发
chonghuihedong 发表于 2015-8-7 10:15:34

藤椅
420948492 发表于 2015-8-7 12:11:20
发帖时可以用代码形式发布。

板凳
625404022 发表于 2015-8-7 16:59:21
  1. %macro importdata(dirname,typ);        /*参数有三个个:路径,文件类型后缀*/
  2. /*模块1--------------------------------【获取文件名】--------------------*/
  3.     %put %str(----------->dirname=&dirname)        ;
  4.     %put %str(----------->typ=&typ)                ;
  5. data temp_filename                             ;     
  6.             rc=filename("dir","&dirname")             ;/*把&dirname值传给文件引用符“dir"*/   
  7.             openfile=dopen("dir")                     ;/*得到路径标示符openfile,dopen是打开directory的sas内置函数*/
  8.             if openfile>0 then do                     ;/*如果openfile>0表示正确打开路径*/        
  9.                       nummem=dnum(openfile)                   ;/*得到路径标示符openfile中member的个数nummem,即指定目录下文件个数*/        
  10.                       do ii=1 to nummem                       ;           
  11.                          name=dread(openfile,ii)              ;/*用dread依次读取每个文件的名字到name*/           
  12.                          output                               ;/*依次输出*/        
  13.                       end                                     ;     
  14.             end                                       ;     
  15. /* keep name                                 ;*/
  16.                 /*只保留name列*/

  17. run ;

  18.          proc sort data = temp_filename             ;/*按照name排序*/     
  19.              by descending name                       ;
  20.              %if &typ^=all %then %do                  ;/*是否过滤特定的文件类型&typ*/     
  21.                where  index(upcase(name),upcase(".&typ"));/*y,则通过检索name是否包含&typ的方式过滤文件类型*/
  22.              %end                                           ;
  23.          run                                            ;

  24. /*-模块2-------------------------【将文件名存为宏变量】----------------*/
  25.          %local N;
  26.         proc sql noprint;
  27.                 select count(*) as cnt into:N
  28.                         from temp_filename ;
  29.         quit;
  30. /*        获取观测行数,也即导入的数据文件个数*/

  31.         data _null_;
  32.                         set  temp_filename  ;
  33.                         call symputx('y'||left(_n_),name);
  34.         run;
  35. /*        将文件名逐个存为临时宏变量*/
  36.                         %do i = 1 %to &N;
  37.                                 %local filenamelist;
  38.                                 %let filenamelist = &filenamelist. &&y&i ;/*对临时宏变量,对各文件名进行连接,各文件名以空格隔开*/
  39.                         %end;
  40.                         %put &filenamelist;

  41. /*-模块3-------------------------【开始批量导入】----------------*/

  42.         %do j = 1 %to &N ;
  43.                         %let var&j = %sysfunc(trim(%scan(&filenamelist,&j,' ')));
  44.                         %put &&var&j;
  45. /*        数据导入-PS:这里以导入txt为例,tab分割,如导入excel需要修改为xls,附加dbms=xls*/
  46.                 PROC IMPORT OUT= temp&j
  47.                          DATAFILE= "&dirname.&&var&j"
  48.                             DBMS=TAB REPLACE;
  49.                      GETNAMES=YES;
  50.                      DATAROW=2;
  51.                 RUN;
  52.   %end;
  53. /*如果是同类型的表,则进行数据合并,根据需要而定*/
  54.                 data merge_temp;
  55.                         set
  56.                           %do j = 1 %to &N;
  57.                                   temp&j        
  58.                           %end;
  59.                         ;
  60.                 run;
  61. %mend;
复制代码


报纸
teqel 发表于 2015-8-7 21:34:16
Have you tested it by yourself?

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 09:40