什么是打破BASE SAS中不平衡报价条件的最佳方法?

问题描述 投票:9回答:9

作为基础SAS程序员,您知道这个练习:

你提交的SAS代码包含一个不平衡的引用,所以现在你不仅得到了未公开的引用,还有未公开的注释,宏函数定义和缺少的运行;或者退出;声明。

没有那些不平衡的报价打扰你的最佳伎俩是什么?

sas base quotes
9个回答
3
投票

企业指南3用于将以下行放在其自动生成的代码的顶部:

*';*";*/;run;

然而,真正“重置”各种不平衡问题的唯一方法是退出sas会话,并在重新提交代码之前平衡任何不平衡的事情。使用这种快速(廉价?)黑客攻击并不能解决根本原因。

顺便说一句,ods _all_ close;关闭所有ods目的地,包括默认的结果目的地。在交互式会话中,您应该至少根据文档使用ods results;ods results on;再次打开它。但是当我在9.2上测试它时,它没有用,如下所示:

%put sysvlong=&sysvlong sysscpl=&sysscpl;
/* sysvlong=9.02.01M0P020508 sysscpl=X64_VSPRO */

ods _all_ close;
proc print data=sashelp.class;
run;
/* on log
WARNING: No output destinations active.
*/

ods results on;
proc print data=sashelp.class;
run;
/* on log
WARNING: No output destinations active.
*/

6
投票

至于我自己,我通常是Google for "SAS unbalanced quote",最后提交像this这样的东西:

*); */; /*’*/ /*”*/; %mend;

......打破未公开的评论,报价和宏观功能。


5
投票

这是我使用的那个。

 ;*';*";*/;quit;run;
 ODS _ALL_ CLOSE;
 QUIT; RUN;

1
投票

我在宏中出现了不平衡报价的情况,唯一的解决方案是关闭SAS的实例并重新开始。

我觉得SAS是一个令人无法接受的缺陷。

但是,我使用了#2和#5两种方法,它起作用了。首先是#2,然后是#1。我把它们放在所有代码之上,包括我的代码标题,解释这个程序在做什么。

工作就像一个魅力。


1
投票

我编写了一个perl程序,可以读取任何给定的SAS程序并跟踪应该成对出现的内容。对于可以嵌入的括号等内容,它会在每行的开头打印嵌套级别。它需要能够区分作为宏函数一部分的括号与作为数据步骤函数一部分的括号,包括驻留在宏环境中的%sysfunc调用,但调用数据步骤函数(对于%syscall宏也必须类似)函数调用),但这可以通过正则表达式来实现。如果嵌套水平变为负值,那么问题可能就在附近。

它还开始计算程序开头的单引号和双引号,并确定它遇到的每个这样的符号的计数是奇数还是偶数。与括号一样,它需要能够区分作为宏代码一部分的引号和作为数据步代码一部分的引号,以及那些属于文字字符串的引号,如O'Riley和%nrstr(%'%“)并且不计算它们,但模式匹配也可以处理它。

如果不匹配项的问题源于宏代码在运行时生成的代码,因此源程序中不存在,那么我打开选项mfile将生成的数据步骤代码写入文件然后运行perl脚本反对该代码。

我之所以选择perl是因为它具有强大的模式匹配功能,但任何其他模式匹配语言都可以正常工作。希望这可以帮助。


0
投票

您可以随时发出terminate submitted statements命令并重新提交您尝试运行的内容。


0
投票

只是想重申AFHood建议使用ODS _ALL_ CLOSE;声明。这是一个包含的关键因素。并确保每次完成ODS时都使用它。


0
投票

在我的案例中关闭SAS会话。我想你可以尝试一次,然后再尝试这里提到的其他方法。


-1
投票

是的,我相信官方SAS文档建议您自己提出的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.