SAS中文论坛

标题: 利用SAS获取文件列表的几种方法 [打印本页]

作者: slash    时间: 2014-3-17 19:46
标题: 利用SAS获取文件列表的几种方法
今天跟大家分享一些SAS中用来获取文件列表的一些方法,包括操作系统某个指定文件夹下的文件列表,以及FTP某个文件夹下的文件列表。

      1. 通过函数获取
            该种方法使用多个函数来获取文件列表,使用的函数包括:filename、dopen、dnum、dread、dclose。示例如下所示:
  1. %let path=C:\Program Files\SASHome;
  2.   data filelist;
  3.    rc=filename("mydir","&path");
  4.    did=dopen("mydir");
  5.    if did gt 0 then do;
  6.     memcount=dnum(did);
  7.     do i=1 to memcount;
  8.      memname=dread(did,i);
  9.      output;
  10.     end;
  11.    end;
  12.    else put "ERROR: Can't find the path!";
  13.    rc=dclose(did);
  14.    keep memname;
  15.   run;
复制代码

         此种方式可以获取指定文件夹下的文件,以及文件夹列表,结果如下所示:
          [attach]42[/attach]


       2. 通过pipe匿名管道获取文件列表
          通过Windows平台下的匿名管道获取文件列表是较为简单的,不需要那么多函数的参与,只需要filename与infile语句即可完成,具体如下所示:
  1. filename loc_in pipe "dir ""&path"" /b";
  2.   data filelist2;
  3.    infile loc_in truncover;
  4.    length name $ 200;
  5.    input name;
  6.   run;
复制代码


            得到的结果与上面一样,获取的列表包括文件夹和文件。
             注意:此处的filename语句当中的引号,宏变量path被双引号引起来,为的是解决路径当中出现空格的问题。

             如果采用这种形式:
  1. filename loc_in pipe "dir &path /b";
复制代码

             若路径中没有空格,则会正常获取到列表;若路径中有空格,则会出现以下错误:
                             [attach]43[/attach]


              由于路径中有空格,操作系统会寻找C:\Program这个文件夹,实际上这个文件夹是不存在的,因此会报错。

      获取FTP目录的文件列表也是通过filename与infile语句来实现的,具体如下所示:
      我们以SAS中文论坛的FTP为例进行演示。SAS中文论坛FTP的地址是:mysas.vicp.net;上面有很多资料,大家可以去看看,也欢迎大家将资料上传
      进行共享。
      关于FTP的详细信息,请参见:SAS中文论坛FTP站 http://www.mysas.net/forum/forum.php?mod=viewthread&tid=2797&fromuid=9
      程序如下:
  1. %let ftp_host=mysas.vicp.net;
  2.   %let encoding=utf-8;
  3.   %let cd=;
  4.   %let user=mysasdown;
  5.   %let pass=mysasdown;
  6.   filename ftp_in ftp '' ls host="&ftp_host" cd="&cd" encoding="&encoding" user="&user" pass="&pass";
  7.   data ftplist;
  8.    infile ftp_in truncover;
  9.    length name $ 100;
  10.    input name $;
  11.   run;
复制代码

       结果如下所示:
         [attach]44[/attach]
       大家看到了吧,FTP上有相当多的资料。
       另外cd=选项用来指定文件夹,上面程序中为空,表示根目录,现在将其赋值为:
      
  1. %let cd=SAS考证辅导;
复制代码

       重新运行后,得到结果:
         [attach]45[/attach]


PS:如果不希望FTP密码在代码中出现,可以使用PROC PWENCODE对密码进行加密处理,如下所示:
  1. proc pwencode in='mysasdown' ;
  2. run;
复制代码

加密后的密文在日志中显示,如下所示:
[attach]46[/attach]

使用该密文替换pass=参数中的值即可。


OK,今天的分享就到此为止,希望大家有所收获。










作者: shiyiming    时间: 2014-3-17 22:05
非常实用啊!太赞了!
作者: webgu    时间: 2014-3-17 22:42
相当给力!相当不错!

简洁明了。

我曾基于这个写过一个应用: 批量导入EXCEL到SAS,用的就是这几种方法。

http://blog.sina.com.cn/s/blog_41889b900101spcv.html


此外,还有一种,那就是用DOS命令结合X语句。




作者: slash    时间: 2014-3-23 11:47
webgu 发表于 2014-3-17 22:42
相当给力!相当不错!

简洁明了。


作者: wpfwxn    时间: 2014-4-3 22:51
为啥我感觉ftp上的资料变少了呢,记得去年登陆的时候资料比现在多呀
作者: shiyiming    时间: 2014-4-3 23:20
wpfwxn 发表于 2014-4-3 22:51
为啥我感觉ftp上的资料变少了呢,记得去年登陆的时候资料比现在多呀

一直在增多,从未删除过。
作者: 愤怒的老鸟    时间: 2014-4-18 17:32
相当漂亮、、、赞一个
作者: younglx    时间: 2014-4-20 21:45
不错不错,非常好!




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2