设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1504|回复: 0

SAS批量清洗所有data所有字符变量

[复制链接]

20

主题

176

金钱

290

积分

入门用户

发表于 2019-7-24 13:52:29 | 显示全部楼层 |阅读模式

当一些data中数据出现录入不规范的问题,我们需要对每个数据集每个字符型变量进行数据处理清洗。如果是excel大家或许会想直接用替换工具,但是如果是sas数据集,我们可以写个宏循环相关程序来自动清洗数据。
首先我们需要得到某逻辑库下所有数据集列表:
1.jpg

这样我们就可以得到文件下所有数据集的名字。
然后我们需要写一个宏循环遍历数据集名字的列表,宏循环内部还得有个遍历变量列表的循环,这样我们就可以遍历每个数据集每个变量。具体程序如下:
2.jpg

源代码:
  1. %let path = D:\data\;
  2. libname raw "&path";

  3. filename folder pipe "dir &rootpath. /b";
  4. data file_list;
  5. length filename $200;
  6. infile folder truncover;
  7. input filename;
  8. run;

  9. data file_list;
  10. set file_list;
  11. if find(filename, '.sas7bdat');
  12. run;

  13. proc sql noprint;
  14. select count(distinct filename)
  15. into :n
  16. from file_list;
  17. select filename into :filelist separated by ' '
  18. from file_list;
  19. quit;
  20. %put &filelist;
  21. %put &n;

  22. %macro clean;
  23. %do i = 1 %to &n;
  24. /* get the data list*/
  25. %let file&i = %scan(&filelist, &i, %str( ) );
  26. %let len=%length(&&file&i);
  27. %let ext=%sysfunc(length(.sas7bdat));
  28. %let ds&i = %substr(%scan(&filelist, &i, %str( )),1, %eval(&len - &ext));
  29. /* get the varlist per &&ds&i */
  30. proc contents data=raw.&&ds&i out=varlist varnum noprint;
  31. run;
  32. proc sql noprint;
  33. select name into :varlist separated by ' '
  34. from varlist
  35. where type=2;
  36. select count(name) into :m
  37. from varlist
  38. where type=2;
  39. quit;

  40. /* Clean the data using regular expression */
  41. data &&ds&i;
  42. set raw.&&ds&i;
  43. %do j = 1 %to &m;
  44. %let var&j = %scan(&varlist, &j, %str( ) );
  45. &&var&j=prxchange("s/’/'/", -1, &&var&j);
  46. %end; /*正则表达式:字符替换中文逗号替换为英文逗号*/
  47. run;

  48. %end;

  49. %mend;
  50. %clean;
复制代码

整个程序只需要传一个参数,即是所有sas数据集所在的目录,虽然这段程序只是做了一个简单的事情,即是批量字符替换,但是这种同时遍历数据集列表和变量列表的方法是值得学习的,这样的传参较少的循环算法能够提高工作效率,我们可以用这种思维便捷地去做更多复杂的事情。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表