|
当一些data中数据出现录入不规范的问题,我们需要对每个数据集每个字符型变量进行数据处理清洗。如果是excel大家或许会想直接用替换工具,但是如果是sas数据集,我们可以写个宏循环相关程序来自动清洗数据。
首先我们需要得到某逻辑库下所有数据集列表:
这样我们就可以得到文件下所有数据集的名字。
然后我们需要写一个宏循环遍历数据集名字的列表,宏循环内部还得有个遍历变量列表的循环,这样我们就可以遍历每个数据集每个变量。具体程序如下:
源代码:
- %let path = D:\data\;
- libname raw "&path";
- filename folder pipe "dir &rootpath. /b";
- data file_list;
- length filename $200;
- infile folder truncover;
- input filename;
- run;
- data file_list;
- set file_list;
- if find(filename, '.sas7bdat');
- run;
- proc sql noprint;
- select count(distinct filename)
- into :n
- from file_list;
- select filename into :filelist separated by ' '
- from file_list;
- quit;
- %put &filelist;
- %put &n;
- %macro clean;
- %do i = 1 %to &n;
- /* get the data list*/
- %let file&i = %scan(&filelist, &i, %str( ) );
- %let len=%length(&&file&i);
- %let ext=%sysfunc(length(.sas7bdat));
- %let ds&i = %substr(%scan(&filelist, &i, %str( )),1, %eval(&len - &ext));
- /* get the varlist per &&ds&i */
- proc contents data=raw.&&ds&i out=varlist varnum noprint;
- run;
- proc sql noprint;
- select name into :varlist separated by ' '
- from varlist
- where type=2;
- select count(name) into :m
- from varlist
- where type=2;
- quit;
- /* Clean the data using regular expression */
- data &&ds&i;
- set raw.&&ds&i;
- %do j = 1 %to &m;
- %let var&j = %scan(&varlist, &j, %str( ) );
- &&var&j=prxchange("s/’/'/", -1, &&var&j);
- %end; /*正则表达式:字符替换中文逗号替换为英文逗号*/
- run;
- %end;
- %mend;
- %clean;
复制代码
整个程序只需要传一个参数,即是所有sas数据集所在的目录,虽然这段程序只是做了一个简单的事情,即是批量字符替换,但是这种同时遍历数据集列表和变量列表的方法是值得学习的,这样的传参较少的循环算法能够提高工作效率,我们可以用这种思维便捷地去做更多复杂的事情。 |
|