SAS如何批量执行脚本
2023-07-02 本文已影响0人
Break_Down
面对三期临床试验的海量数据,DM 数据清理如果纯靠肉眼恐怕会眼瞎;若用excel公式,面对如此数据量怕也是会死机吧。这个时候,DBP作为临床试验团队的一员就会为提高数据清理效率贡献自己的力量,使用编程的手段辅助清理。
目的
我司数据清理所涉及到的sas script文件大概有70-80个,若不使用批运行,效率很低,且失误率较高,故编写了批运行脚本.
核心代码
%inc "&script_name"; # 执行SAS脚本文件
思路
1.读取stripts文件夹下所有的脚本文件名,与路径拼接,组成完整的绝对路径.
2.根据得到的完整路径生成宏变量.
3.通过循环遍历宏变量,使用%inc语句批量运行.
完整代码
proc datasets library=work nolist nodetails kill;
option nonotes; #不打印note,只打印warning与error,方便debug
/*--------------------------
dirpath:脚本目录,需要修改
---------------------------*/
libname in "E:\my_project\data";
%let dirpath=E:\my_project\script;
%let excute=E:\my_project\执行批次.xlsx;
proc import datafile="&excute" out=excute dbms=excel replace;
sheet='sheet1';
getnames=yes;
run;
data filelist;
fileres = filename("dirpath","&dirpath."); #将目录路径读取至dirpath变量
dirid=dopen("dirpath"); #打开目录路径
direct="&dirpath.";
num=dnum(dirid); #脚本数量
do i=1 to num; #循环
filename=dread(dirid,i); #读取脚本名称
filepath=catx("\\",direct,filename); # 将目录路径与脚本名称拼接成完整路径,单斜杠即可,MarkDown语法我不熟悉,但斜杠会把后面全变成注释.
output;
end;
run;
proc sql; #因为我这边部分脚本时用python写的,所以要把那部分排除掉.
create table filelist1 as select a.filepath,a.filename
from filelist as a
inner join excute as b on find(filename,strip(listname))
where substr(filename,length(filename)-3,4)=".sas" and batch^="一致性";
quit;
%macro execute_script();
proc sql noprint;
select count(*) into :_row from filelist1;
select filepath into :file1-:file%left(&_row.) from filelist1; # 将所有脚本生成宏变量
select filename into :name1-:name%left(&_row.) from filelist1;
quit;
%do i=1 %to &_row.;
%inc "&&file&i.."; #批量执行宏变量
%put &&name&i.. done.;
%end;
%put finished.;
%mend;
%execute_script();
题外话
数据清理的核查点有很多,通常我们会每个核查点写成一份sas script,然后把所有文件放到一个文件夹里。此前有朋友问过我,为什么要每一个核查点写一个文件,而不能所有的核查点全部写入同一个文件呢?说实话这两种风格我都写过,也有过一些思考,说不定会有其他人有同样的问题,我在这里记录下:
核查过程往往会使用多个数据集交叉核查,如果在同一个文件里多个数据点编程的时候总会不断引用同一个数据集,随着代码累积,加之没有很好的对tmep数据集命名,代码会逐渐混乱不可控,我们会分不清当前正在处理的数据集的源头是什么,大大加大了review和debug的难度;后期数据库改库需要更新核查时,也会无从下手。