作为基础 SAS 程序员,您知道以下练习:
您提交了包含不平衡引用的 SAS 代码,所以现在您不仅有未闭合的引用,还有未闭合的注释、宏函数定义和缺少的运行;或退出;陈述。
不让那些不平衡的报价打扰您的最佳技巧是什么?
这是我使用的那个。
;*';*";*/;quit;run;
ODS _ALL_ CLOSE;
QUIT; RUN;
企业指南 3 曾经在其自动生成的代码顶部放置以下行:
*';*";*/;run;
然而,真正从各种不平衡问题中“重置”的唯一方法是退出 sas 会话,并在重新提交代码之前平衡任何不平衡的东西。使用这种快速(便宜?)的黑客并不能解决根本原因。
顺便说一句,ods _all_ close;
关闭所有ods 目的地,包括默认的 results 目的地。在交互式会话中,您应该使用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.
*/
我遇到了宏中引号不平衡的情况,唯一的解决方案是关闭 SAS 实例并重新开始。
我觉得这是 SAS 的一个不可接受的缺陷。
但是,我使用了 #2 和 #5 的方法并且它有效。首先是#2,然后是#1。我把它们放在所有代码之上,包括我的代码头,解释这个程序在做什么。
像魅力一样工作。
我编写了一个 perl 程序,它可以读取任何给定的 SAS 程序并跟踪应该成对出现的东西。使用可以嵌入的括号之类的东西,它会在每行的开头打印嵌套级别。它需要能够区分属于宏函数的括号和属于数据步进函数的括号,包括驻留在宏环境中但调用数据步进函数的 %sysfunc 调用(也必须对 %syscall 宏执行类似操作函数调用),但这可以通过正则表达式实现。如果嵌套级别变为负数,则表明问题可能就在附近。
它还从程序开始计算单引号和双引号,并识别它遇到的每个此类符号的计数是奇数还是偶数。与括号一样,它需要能够区分宏代码中的引号和数据步骤代码中的引号以及文字字符串中的引号,例如 O'Riley 和 %nrstr(%'%")不计算它们,但模式匹配也可以处理。
如果项目不匹配的问题源于宏代码在运行时生成的代码,因此在源程序中不存在,那么我打开选项 mfile 将生成的数据步骤代码写入文件,然后运行 perl 脚本反对该代码。
我选择 perl 是因为它强大的模式匹配功能,但任何其他模式匹配语言都应该可以正常工作。希望这可以帮助。
这对我来说几乎每次都有效:
; *'; *"; */;
ODS _ALL_ CLOSE;
quit; run; %MEND;
data _NULL_; putlog "DONE"; run;
您总是可以发出终止提交的语句命令并重新提交您尝试运行的内容。
只是想重申 AFHood 使用该ODS _ALL_ CLOSE;
声明的建议。这是要包括的关键之一。并且确保每次完成 ODS 时都使用它。
关闭 SAS 会话对我来说是有效的。我认为您可以先尝试一次,然后再尝试此处提到的其他方法。
是的,我相信官方 SAS 文档会推荐您为自己提出的解决方案。