【问题标题】:How to batch modify SAS programs with a SAS program?如何用 SAS 程序批量修改 SAS 程序?
【发布时间】:2018-04-18 20:38:46
【问题描述】:

我知道我们可以使用数据步骤将“*.sas”程序作为数据集进行归档,每一行代码都是数据集的一条记录。然后我可以使用 SAS 对数据集进行更改。

假设我在 c:\pgm 中已经存在 100 个程序,我需要做的只是一些小的修改,例如将所有这 100 个程序的 flag1 更改为 flag2。如果我不想打开每个程序并一个一个替换标志。有没有办法在 c:\pgm 中获取所有程序名称,以便我可以遍历这些名称并进行替换。

我使用的是 SAS 9.4 和 EG。谢谢!

【问题讨论】:

  • .sas 文件只是一个文本文件,您可以使用操作系统命令进行搜索/替换。 gist.github.com/statgeek/26cf789d6da0ce941e447022fdccf0f4 这样就找到了字符串,改起来应该比较简单。
  • @Reeza OS / 文件系统对 .sas 文件的访问不能总是假设。我在一家只有 EG 的公司工作,无法直接访问文件系统或操作系统。我最终编写了一个工具来专门执行 OP 的要求以及执行差异的工具。在 OP 的情况下,唯一的选择可能是一个一个地打开 100 个项目并进行更改。
  • 第一个链接实际上并没有演示 OS 方法,它是一个使用 INFILE 方法的 SAS 程序。
  • 使用像notepad++这样可以在文件中进行搜索和替换的文本编辑器会简单得多!

标签: sas


【解决方案1】:

我可能有点过于复杂了,但想法如下:

  • 提取文件夹中所有sas文件的列表
  • 为这些文件创建一个宏变量数组
  • 循环并在每个提取的单个文件上调用 editFile 宏。
%let dir=C:\prg;
%let var_prefix=vars_;

%macro batchEdit;
data _null_;
  pfad="&dir.";
  rc=filename("fileref",pfad);
  did=dopen("fileref");
  if did eq 0 then do;
    putlog "Dir does not exist";
    return;
  end;
  num=dnum(did);
  j=1;
  do i=1 to dnum(did);
    name=dread(did,i);
    if UPCASE(substrn(name,max(1,length(name)-3),4)) eq ".SAS" then do;
      call symput(CATS("&var_prefix.",j),name);
      j=j+1;
    end;
  end;
  call symput("varcnt",j);
  rc=dclose(did);
  rc=filename("fileref");
run;

  %DO j=1 %TO &varcnt.;
    %editFile(file=&&&var_prefix&j);
  %END;
%mend;

%macro editFile(file=);
%put In this Macro you should define what modification should be done on each single file;
%put Current File: &file.;
%mend;

%batchEdit;

附:我已经在 unix SAS 服务器上测试过,所以它可能需要在 PC SAS 上进行一些修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多