追逐夢想的孩子 发表于 2019-7-24 13:52:29

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


当一些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数据集所在的目录,虽然这段程序只是做了一个简单的事情,即是批量字符替换,但是这种同时遍历数据集列表和变量列表的方法是值得学习的,这样的传参较少的循环算法能够提高工作效率,我们可以用这种思维便捷地去做更多复杂的事情。
页: [1]
查看完整版本: SAS批量清洗所有data所有字符变量