使用%include自动执行不同站点的SAS程序

时间:2017-11-17 00:21:21

标签: automation sas sas-macro

我遇到的问题是,我在多个网站上使用相同的程序进行报告。我必须分别为每个代码运行代码。我希望自动化我的流程来调用代码并一次性运行所有站点。这是我尝试使用的代码,但它不起作用。

data _null_;
array sites {2} _temporary_ (SiteA SiteB);

do k = 1 to dim(sites);
    %let site = sites(k);

    %include '...path\SitesWait.sas';

end; run;

SiteWait中的代码可以完美地运行。我定义了一个名为site的宏变量,它设置要运行的代码的站点。

我一直得到的错误是错误117-185:有1个未关闭的DO阻止。'

由于

4 个答案:

答案 0 :(得分:1)

因此,您希望根据以前的数据集包含不同的文件。我建议您创建文件而不是从数组中读取它,但要保持初始请求的精神:

%let basePath= c:\foo;

data _NULL_;
    array sites {2} $5. ('SiteA' , 'SiteB');

    do k = 1 to dim(sites);
        site = sites(k);
        call execute('%nrstr(%put &basePath.\'||site||';)');
    end;
run;

这会产生

  

C:\ FOO \站点A

     

C:\ FOO \ SiteB中

您可以使用%include轻松替换%put命令,以达到您的目的。

修改:我建议您尝试做的事情是这样的:

data includes;
    format path $30. file $10.;
    input path $ file $;
    cards;
    c:\foo\ file1.sas
    c:\foo\ file2.sas
    c:\Bar\ file1.sas
    c:\Bar\ file2.sas
; run;

data _null_;
    set includes;
        call execute('%nrstr(%put '||strip(path)||''||strip(file)||';)');
run;

答案 1 :(得分:1)

你应该这样做:

main.sas

%macro ProcessList;
    %let list_of_site=SiteA|SiteB|SiteC;
    %let k=1;
    %do %while (%qscan(&list_of_site, &k,|) ne );
        %let site = %scan(&list_of_site, &k,|);
        %include 'H:\desktop\SAS\test_inc.sas';
        /*%put site=&site;*/
        %let k = %eval(&k + 1);
    %end;


%mend ProcessList;
%processList;


test_inc.sas

%put site=&site;

结果:

site=SiteA
site=SiteB
site=SiteC

使用宏观功能很简单。您可以将%include替换为%put。

您可以使用此技术从数据集中获取网站列表:

data test;
infile datalines dsd;
   input site : $200. ;
   datalines;
SiteA,
SiteB,
SiteC,
SiteD,
SiteE,
SiteF,
; 
run;

proc sql noprint;
   select quote(trim(site), "'") into : list_of_site separated by "|" from work.test;
quit;

此致

答案 2 :(得分:1)

您不能在DATA步骤的中间包含另一个多步骤程序。 %include只是将文件中的行放入程序流中,就好像已将行输入到程序中一样。当SAS看到包含文件中的第一个DATA或PROC语句时,它将停止编译主程序中的DATA步骤并运行它。这就是你的DO循环没有看到END语句的原因。

您可以使用数据步骤生成设置参数的代码,并包含程序。

data _null_;
  length site $20 ;
  do site='SiteA','SiteB' ;
    call execute(cats('%nrstr(%let) site=',site,';'));
    call execute("%include '...path\SitesWait.sas';");
  end;
run;

您创建的内容基本上是一个名为SITE的单个参数的宏。事实上,您可以使用%INCLUDE作为宏定义的主体。然后你可以只编写你想要的调用,而不是试图处理一些值列表。

%macro siteswait(site);
%include '...path\SitesWait.sas';
%mend;
%siteswait(SiteA)
%siteswait(SiteB)

答案 3 :(得分:0)

如果网站不经常更改,并且网站中的网站数量不多,那么可能是最简单的方法:

{
  "name": "server",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "./node_modules/nodemon/bin/nodemon.js src/app.js --exec 'npm run lint && node'",
    "lint": "./node_modules/.bin/eslint **/*.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.2",
    "cors": "^2.8.4",
    "eslint": "^4.11.0",
    "express": "^4.16.2",
    "morgan": "^1.9.0",
    "mysql": "^2.15.0",
    "nodemon": "^1.12.1",
    "sequelize": "^4.22.6",
    "sqlite3": "^3.1.13"
  },
  "devDependencies": {
    "eslint-config-standard": "^10.2.1",
    "eslint-plugin-import": "^2.8.0",
    "eslint-plugin-node": "^5.2.1",
    "eslint-plugin-promise": "^3.6.0",
    "eslint-plugin-standard": "^3.0.1"
  }
}

但要小心。您可能希望在SitesWait.sas顶部包含代码,以便重置'你是SAS会议。即。清除您计划使用的任何宏值,删除工作文件夹中的任何数据集等。否则第二次调用%let site=siteA; %include '...path\SitesWait.sas'; %let site=siteB; %include '...path\SitesWait.sas'; %let site=siteC; %include '...path\SitesWait.sas'; 可能会受到之前运行的影响。