.sas7bdat文件与.xpt文件批量转换

当我们拿到的原始数据为.xpt格式时,就需要批量转换成.sas7bdat文件以便后续处理,而当我们要准备SDTM Package时,我们又要将.sas7bdat文件批量转换成.xpt文件。

  1. 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;
    
  2. 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

曾宪华 /
本文采用 署名-非商业性使用-相同方式共享 3.0许可协议 属于 程序人生 分类, 被贴了 CALL EXECUTE CALL SYSTEM FILENAME PIPE PRXCHANGE 书签

上一篇 正则表达式之贪婪匹配 VS 非贪婪匹配
下一篇 正则表达式之非捕获匹配(?:...)