作为基础SAS程序员,您知道演练:

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

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

有帮助吗?

解决方案

企业指南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.
*/

其他提示

就我自己而言,我通常 Google for”SAS unbalanced quote“,最终提交类似这个

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

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

这是我使用的那个。

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

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

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

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

像魅力一样工作。

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

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

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

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

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

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

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

是的,我相信官方SAS文档会推荐您为自己提出的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top