SAS编程:移除文件夹中多余的程序

在日常工作中,SDTM、ADaM以及TFL编程的程序、Output名称都会提前规定好,直接根据Spec、Tracker进行编程输出。但是,在一些非常紧急的项目中,SAP、TFLShell没有稳定,就不得不提前进行编程,这时候不可避免地发生Output、程序增删的情况,从而导致文件夹中有多余的SAS程序。

在输出Ouput、程序数目较多的情况下,人工检查多余程序显然不现实。于是,写了个简单的程序,用于移除文件夹中多余的程序。程序的主体内容主要有以下几部分:

  1. 读入用于保存程序输出列表的Tracker文档;
  2. 读入目标文件夹下所有SAS程序名称;
  3. SQL语句判断文件夹中缺少或多余的SAS程序;
  4. 对于多余的SAS程序,复制备份一版,然后删除;
  5. 对于缺少的SAS程序,提醒组员新建。

1. 读入EXCEL文档

简单import的语句读入Tracker中程序的信息。

***1. Get program names in SPEC;
%let excel = %str(/aaa/bbb/xxx.xlsx);

options validvarname = v7;
proc import datafile = "&excel." out = pgm dbms = xlsx replace;
run;

2. 读入文件夹下所有SAS程序名称

这个功能在之前文章中介绍过, SAS编程:如何获取某路径下文件的名称? 。

直接集合成一个宏程序,方便后续调用。

***2. Get file name;
%macro get_file(dirpath= , outdt=, type= sas);

%if "&dirpath." ne "" %then %do;

%local dirpath_tmp slash;

%let slash = %substr(%sysfunc(compress(&dirpath., : _ , a d)), 1, 1);

*Remove trailing slash;
%if "%substr(&dirpath.,%length(&dirpath.),1)" = "&slash." %then %let dirpath_tmp=%substr(&dirpath.,1,%length(&dirpath.)-1);
%else %let  dirpath_tmp = &dirpath.;


**Dopen--Get filepath;
data &outdt.;
  fileres = filename("dirpath", "&dirpath_tmp");
  dirid = dopen("dirpath");
  num = dnum(dirid);

  length direct filename filepath $200;

  if dirid > 0 and num >0 then do;
    do i = 1 to num;
      direct = "&dirpath_tmp.";
      filename = dread(dirid, i);
      filepath = catx("&slash.", direct, filename);

      if strip(scan(filename, 2, "."))="&type." then output;
    end;
  end;

  keep filename filepath;

  proc sort;
    by filename;
run;
%end;
%else %do;
  %put Err-or: Path is missing.;
%end;

%mend;

%get_file(
  dirpath = xxxx
  ,outdt = Source_pgm
);

宏程序输出数据集内容如下:

3. SQL语句判断缺少或多余的程序名称

在获取Tracker中程序列表以及当前文件夹中SAS程序程序名称后,使用SQL语句就进行筛选,就可以获取在Tracker中但不在文件夹中的程序,以及在文件夹中但不在Tracker中的程序。前者需要在文件夹中新建,后者需要从文件夹中移除。

这一部分程序中,会新建一个变量保存,复制粘贴的目标文件,其中宏变量&source_recy是需要保存多余程序的目标文件夹。

***3. Check differernce between tracker and folder;
%let source_recy = %str(/ccc/ddd/);

proc sql noprint;

  **in tracker not in folder;
  create table source_inspec as
    select program_name, program_programmer_1, program_programmer_2
  from pgm
  where program_name not in 
    (
      select filename from source_pgm
    )
  ;

  **in folder not in tracker;
  create table source_infolder as
    select *, "&source_recy./"||strip(filename) as filepath_recy
    from source_pgm
    where filename not in 
      (
        select program_name from pgm
      )
  ;
quit;

程序运行结果如下,变量filepath保存后续需要复制的文件,变量filepath_recy复制后的文件地址。两个变量取值后续会使用filename函数建立文件引用,用于文件的复制和删除。

4.复制多余的程序,并从原文件夹中删除

复制和删除使用的是fcopyfdetete函数,这两个函数的参数都是文件引用,需要提前用filename进行建立。

一般建立文件引用还可以使用filename语句,但这个方法不方便调用数据集中的变量值,这个例子中使用filename函数较为方便。

关于函数FCOPYFDELETE的用法,读者可以直接参考SAS官方文档,这里就不再详细介绍。

***4. Copy and delete programs in folder but not in tracker;
data rst;
set source_infolder;
rc1 = filename("src"||strip(put(_n_, best.)), filepath);
rc2 = filename("dest"||strip(put(_n_, best.)), filepath_recy);

length msg $400;

rc = fcopy("src"||strip(put(_n_, best.)), "dest"||strip(put(_n_, best.)));

if rc = 0 then do;
  put filename = " Copy Success";
  rfd = fdelete("src"||strip(put(_n_, best.)));

  msg = sysmsg();
  put filename= rfd= msg=;
end;
else do;
  msg = sysmsg();
  put filename= rc= msg=;
end;
run;

5. 通知组员新建缺少的SAS程序

SQL语句筛选出在Tracker中但不在Folder中的程序时,可以保留Programmer的信息,这样方便定位到对应组员,方便通知更新。

总结

这篇文章介绍了如何使用SAS编程,移除文件夹中多余的SAS程序。移除的同时,也会备份对应的程序。这个过程涉及多个与文件处理相关的SAS函数,若不熟悉相关含义,读者可以参阅SAS文档。

感谢阅读, 欢迎关注:SAS茶谈!
若有疑问,欢迎评论交流!

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容