楼主: playmore
1669 1

[SAS] SAS基础宏之19:GetFileAndSubDirInfoInDir [推广有奖]

已卖:1645份资源

学科带头人

2%

还不是VIP/贵宾

-

TA的文库  其他...

R相关

经济学相关

金融工程

威望
1
论坛币
16356 个
通用积分
8.6697
学术水平
372 点
热心指数
394 点
信用等级
341 点
经验
15297 点
帖子
1194
精华
1
在线时间
1332 小时
注册时间
2007-1-11
最后登录
2025-12-1

初级学术勋章 初级热心勋章 中级热心勋章

楼主
playmore 发表于 2015-3-7 20:15:38 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
宏作用



作用是取得一个文件夹下所有文件和文件夹的信息


  1. %macro GetFileAndSubDirInfoInDir(InDirPath,Filter,TargetTable,OutFilePath,Expand);
  2. /**********************************************************************/
  3. /* 此宏用于获得目标文件夹下所有文件及子文件夹的信息,并将此信息保存至 */
  4. /* SAS表格或导出至txt文件中。其中,InDirPath是指定的目标文件夹路径,  */
  5. /* 路径最后要加上\;Filter是文件过滤设置,支持*和?通配符,若需要导出  */
  6. /* 所有文件列表,可以设置为空;TargetTable是保存文件信息的SAS表格,若 */
  7. /* 不需要生成,可以设为空;OutFilePath是导出txt文件的路径,若不需要导 */
  8. /* 出,可以设为空;Expand是标记变量,=Yes表示展开所有文件夹,列表最后 */
  9. /* 包含文件及其所处文件夹信息,=NO表示只列出目标文件夹下第一层文件和  */
  10. /* 文件夹的信息。                                                     */
  11. /*                                                                    */
  12. /* 最终得到的是含有目标文件夹下所有文件及子文件夹信息的SAS表格和存于  */
  13. /* 指定路径的txt文件。                                                */
  14. /*                                                                    */
  15. /* 注意运行此宏可能会产生数量不等的错误信息,这是由于利用DIR命令得到  */
  16. /* 结果表格纵向格式不一致引起的,但不会影响结果的正确性。             */
  17. /*                                                                    */
  18. /**********************************************************************/
  19. /* 确保InDirPath后接\符号 */
  20. %if %SYSFUNC(FIND(%SYSFUNC(REVERSE(&InDirPath)),\)) NE 1 %then %let InDirPath=&InDirPath.\;
  21. /* 关闭显示LOG信息 */
  22. options nosource nonotes errors=0;
  23. /* 第一步:首先将InDirPath文件夹下所有文件的信息导出至OutFilePath文件中 */
  24. /* 情形1:参数OutFilePath为完整文件路径情形 */
  25. %if %SYSFUNC(FIND(&OutFilePath,%STR(.))) NE 0 %then %do;
  26. /* 情形1-1:展开所有文件夹 */
  27. %if %UPCASE(&Expand) EQ YES %then %do;
  28.   %ChkFile(&OutFilePath);
  29.   options noxwait xsync;
  30.   x "dir &InDirPath.&Filter /s /a > &OutFilePath";
  31. %end;
  32. /* 情形1-2:不展开文件夹,只包含第一层子文件夹和文件的信息 */
  33. %else %if %UPCASE(&Expand) EQ NO %then %do;
  34.   %ChkFile(&OutFilePath);
  35.   options noxwait xsync;
  36.   x "dir &InDirPath.&Filter > &OutFilePath";
  37. %end;
  38. /* 情形1-3:错误输入Expand参数情形 */
  39. %else %do;
  40.   %put ERROR: The last parameter should be Yes or No, case insensitive and without quotes.;
  41.   %goto exit;
  42. %end;
  43. %end;
  44. /* 情形2:参数OutFilePath为空情形 */
  45. %else %if %UPCASE(&OutFilePath) EQ %STR() %then %do;
  46. /* 情形2-1:展开所有文件夹 */
  47. %if %UPCASE(&Expand) EQ YES %then %do;
  48.   options noxwait xsync;
  49.   x "dir &InDirPath.&Filter /s /a > d:\GFASDIID_temp.txt";
  50.   %let OutFilePath=d:\GFASDIID_temp.txt;
  51. %end;
  52. /* 情形2-2:不展开文件夹,只包含第一层子文件夹和文件的信息 */
  53. %else %if %UPCASE(&Expand) EQ NO %then %do;
  54.   options noxwait xsync;
  55.   x "dir &InDirPath.&Filter > d:\GFASDIID_temp.txt";
  56.   %let OutFilePath=d:\GFASDIID_temp.txt;
  57. %end;
  58. /* 情形2-3:错误输入Expand参数情形 */
  59. %else %do;
  60.   %put ERROR: The Expand should be Yes or No, case insensitive and without quotes.;
  61.   %goto exit;
  62. %end;
  63. %end;
  64. /* 情形3:错误输入OutFilePath参数情形 */
  65. %else %do;
  66. %put ERROR: The OutFilePath should contain the full path of directory, including filename and filename extension.;
  67. %goto exit;
  68. %end;
  69. /* 第二步:接着将OutFilePath文件的信息导入SAS数据表中 */
  70. /* 需要生成SAS数据表情形 */
  71. %if %UPCASE(&TargetTable) NE %STR() %then %do;
  72. /* 情形1:展开所有文件夹,此时从第4行开始读 */
  73. %if %UPCASE(&Expand) EQ YES %then %do;
  74.   data GFASDIID_temp;
  75.    infile "&OutFilePath." firstobs=4 truncover;
  76.    input DataString $ 1-100 @; /* 读取的第一个变量,变量长度为10,@表示光标不下移,继续读取此行 */
  77.    input @1 Date YYMMDD10. @13 Time TIME. @19 Bytes_temp $17. @37 FileName $64.;
  78.    if (FIND(DataString,'<DIR>') EQ 0) AND (FIND(DataString,'\') NE 0 OR Date NE .);
  79.    format Date YYMMDD10. Time HHMM.;
  80.   run;
  81.   data &TargetTable(drop=DataString Bytes_temp);
  82.    retain Date Time Bytes FileName DirPath;
  83.    set GFASDIID_temp;
  84.    Bytes=INPUT(Bytes_temp,COMMA17.);
  85.    format Bytes COMMA17.;
  86.    if FIND(DataString,'\') NE 0 then DirPath=COMPRESS(DataString,'的目录');
  87.    if Date NE .;
  88.   run;
  89. %end;
  90. /* 情形2:不展开文件夹,只包含第一层子文件夹和文件的信息,此时从第8行开始读 */
  91. %else %do;
  92.   data GFASDIID_temp(drop=DataString);
  93.    infile "&OutFilePath" firstobs=8 truncover;
  94.    input DataString $ 1-10 @; /* 读取的第一个变量,变量长度为10,@表示光标不下移,继续读取此行 */
  95.    input @1 Date YYMMDD10. @13 Time TIME. @19 Bytes_temp $17. @37 FileName $64.;
  96.    if Date NE .;
  97.    format Date YYMMDD10. Time HHMM.;
  98.   run;
  99.   data &TargetTable(drop=Bytes_temp);
  100.    retain FileName Dir Bytes Date Time;
  101.    set GFASDIID_temp;
  102.    Bytes=INPUT(Bytes_temp,COMMA17.);
  103.    format Bytes COMMA17.;
  104.    if Bytes EQ . then Dir='<DIR>';
  105.    else Dir='';
  106.   run;
  107. %end;
  108. %end;
  109. /* 如需要在SAS的Output窗口中打印文件列表,请取消如下注释 */
  110. /*proc print data=&TargetTable;*/
  111. /*title1 "Files identified through saved file";*/
  112. /*run;*/
  113. /* 删除不必要的表格 */
  114. proc delete data=GFASDIID_temp;
  115. run;
  116. /* 恢复显示LOG信息 */
  117. options source notes errors=5;
  118. %if &OutFilePath=d:\GFASDIID_temp.txt %then x "erase d:\GFASDIID_temp.txt";
  119. %exit:
  120. %mend;

  121. %macro Demo();
  122. %let InDirPath=e:\Works\;
  123. %let Filter=*.sas;  /* 文件过滤设置,若需要导出所有文件列表,则设置为空即可,即Filter=; */
  124. %let TargetTable=FileList;  /* 若不需要生成包含文件列表的SAS表格,则设为空,大小写不敏感 */
  125. %let OutFilePath=;  /* 若不需要导出文件列表txt文件,则设为空,大小写不敏感 */
  126. %let Expand=Yes;  /* =Yes表示展开所有文件夹,列表最后包含文件及其所处文件夹信息,否则=No,大小写不敏感 */
  127. %GetFileAndSubDirInfoInDir(&InDirPath,&Filter,&TargetTable,&OutFilePath,&Expand);
  128. %mend;
复制代码

二维码

扫码加我 拉你入群

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

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

关键词:sas基础 Lean INDI file Info 基础宏 SAS GetFileAndSubDirInfoInDir

已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
niuniuyiwan + 60 + 60 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 60  论坛币 + 60  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

沙发
messem 发表于 2017-9-11 17:16:57
好好好,收集起来。

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-26 20:12