当我们拿到的原始数据为.xpt格式时,就需要批量转换成.sas7bdat文件以便后续处理,而当我们要准备SDTM Package时,我们又要将.sas7bdat文件批量转换成.xpt文件。
- xpt2sas.sas
/*SAS文件路径*/
libname sdata "/home/users/zenga/code/sas/";
/*XPT文件路径*/
%let dir=/home/users/zenga/code/xpt/;
filename xpts pipe "ls &dir.*.xpt";
data _null_;
infile xpts truncover;
input;
XPTFILE=prxchange('s/(. )/(. )(.xpt)/2/',-1, _INFILE_);
call execute('libname xptin xport "&dir.'||strip(XPTFILE)||'.xpt";'
||'proc copy in=xptin out=sdata mt=all; run;');
run;
filename xpts clear;
- sas2xpt.sas
/*XPT文件路径*/
%let dir=/home/users/zenga/code/xpt/;
proc sql;
create table vtable as
select *
from dictionary.tables
where LIBNAME='SDATA'
;
quit;
data _null_;
set vtable end=eof;
MEMNAME=lowcase(MEMNAME);
call execute('libname temp xport "&dir.'||cats(MEMNAME)||'.xpt";'
||'data '||cats(MEMNAME)||'(sortedby=_null_ label="'||cats(MEMLABEL)||'"); set sdata.'||cats(MEMNAME)||'; run;'
||'proc copy in=work out=temp mt=data; select '||cats(MEMNAME)||'; run;');
if eof then call execute('libname temp clear;');
run;
对于第一个程序xpt2sas.sas,获取某一路径下某种文件的文件名也可以用CALL SYSTEM,不过这种方法会产生一个临时文件,所以推荐使用FILENAME PIPE。