【问题标题】:loop whole code many times on SAS program causes error在 SAS 程序上多次循环整个代码会导致错误
【发布时间】:2019-05-02 21:13:03
【问题描述】:

我有一个大约 5000 行的长代码。当我宏这个程序,并循环几次。它执行成功,但是如果我将循环更改为 300 次,代码开始导致错误,我不知道为什么会导致,

%let Numberl=300;

%macro programall;
%do r=0 %to &numberl;
.
.
.
.
.
%end;
%mend Programall;
%Programall;

我认为睡眠功能可以解决这个问题 https://support.sas.com/documentation/cdl/en/lefunctionsref/63354/HTML/default/viewer.htm#p0a6vn2td7bjr2n1viy8y4lgvq61.htm

有人有类似经历吗?

对不起我的英语

谢谢

【问题讨论】:

  • 我不认为代码有什么问题,它应该可以正常运行。但是,do 块中可能存在一些问题..不确定您要在那里做什么..
  • 您在这里展示的内容我们不能说。您的代码可能是错误的,也可能是正确的。你能生成一个产生错误的例子吗?请包括错误!
  • 可能是日志大小问题?您可以尝试打印到外部文件:support.sas.com/documentation/cdl/en/basess/58133/HTML/default/…

标签: loops sas sas-macro


【解决方案1】:

循环内的代码可能没有重置它正在使用的重要宏变量,或者存在嵌套宏调用正在使用未在其%macro 定义中正确声明为%local 的宏变量。

在编写宏时,请确保它使用的变量在顶部声明,如下所示:

%macro foo(top=);
  %local index piece1 piece2;
  %do index = 1 %to ⊤
    %let piece1 = …;
  %end;
%mend;

是否有一致的特定值&r 发生故障?如果是这样,您可能对r 有不正确的假设。

您可以通过在调用%programall 之前设置选项来查看正在生成的宏。这些选项将以最详细的级别记录大量信息:

options mprint mtrace symbolgen;

您可以使用mfile 将宏生成的实际代码保存到外部文件中。

filename mfile 'c:\temp\300-at-Thermopylae.sas';
options mprint mfile;

%programall

%options nomfile;

注意:问题可能出在生成的源代码中,也可能出在它自身的生成过程中。您可以检查保存的.sas 文件是否存在问题,并单独提交部分文件,以便找到出错的地方。

【讨论】:

    【解决方案2】:

    所以,我发现循环之间的代码中有这样的注释

    *********GPA's something;
    

    我起飞'然后开始完美运行。这是评论,但宏似乎需要作为字符串

    谢谢

    【讨论】:

    • 如果语句样式 cmets 嵌入在宏定义中,则不能有不平衡的引号。 SAS 处理器可以正常处理注释语句,但是当嵌入宏定义时它们最终会混淆宏处理器,因此错误的代码被发送到 SAS 执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2012-11-18
    • 2015-06-09
    • 2013-03-15
    相关资源
    最近更新 更多