才开始进入项目做SDTM时,有些数据集里收集的变量长度大于200个字符。但因为没有什么经验,常常会忽略掉这个问题。做SDTM时,每个变量最长放200个字符,多余的字符就要开始拆分为XXXX1,XXXX2等变量。
以前我是写道觉得会有大量字符的变量时去看一眼最大长度,再决定是否要分割。其实后来一想直接写一个宏先读取要用的原始数据,检查出超过200个字符的变量,就不会在后面忽略掉分割了。
这个宏程序的思路大概是:先读取字符型变量有哪些,再计算出每个变量的最大长度,只要大于200输出该变量的名字即可。
简单举个例子:
%macro check_long_vars(dataset=);
proc contents data=&dataset. out=content noprint;
run;
proc sql noprint;
select count(name) into :n from content where type=2;
select name into :namelist separated by "/" from content where type=2;
quit;
%let varn=1;
%let varname=;
%let max_length=200;
%do %while(&varn <=&n.);
%let varname=%sysfunc(scan(&namelist,&varn,"/"));
proc sql noprint;
select max(length(&varname.)) into :varlength trimmed from &dataset.;
quit;
%if &varlength gt &max_length %then %do;
%put WRAW-ING: &varname. 超过200个字符,长度为:&varlength.;
%end;
%let varn=%eval(&varn+1);
%end;
%mend check_long_vars;