你在BASE SAS中打破不平衡引号条件的最佳技巧是什么?

12

作为一名基础的SAS程序员,你应该知道:

在提交SAS代码时,如果存在引号不匹配的情况,将会导致未关闭的引号、注释、宏函数定义以及缺失的run或quit语句。

你有什么最好的技巧来避免这些引号不匹配的问题困扰你呢?

10个回答

8

5
这是我使用的一个。
 ;*';*";*/;quit;run;
 ODS _ALL_ CLOSE;
 QUIT; RUN;

我在SAS中使用这个作为注释 - 如果我遇到不平衡的引号问题,那么输入 fix 就会返回这段代码以快速解决问题。 - Bendy

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

1
我编写了一个perl程序,可以读取任何给定的SAS程序,并跟踪应成对出现的事物。对于像括号这样的嵌套结构,它会在每行开头打印嵌套级别。它需要能够区分宏函数中的括号和数据步骤函数中的括号,包括驻留在宏环境中但调用数据步骤函数的%sysfunc调用(必须对%syscall宏函数调用做类似处理),但这可以通过正则表达式来完成。如果嵌套级别变为负数,则表明问题可能就在附近。
它还从程序开始计算单引号和双引号,并确定遇到每个符号的计数是奇数还是偶数。与括号一样,它需要能够区分宏代码中的引号和数据步骤代码中的引号,以及作为字面字符串的引号,如O'Riley和%nrstr(%'%"),并将其排除在外,但模式匹配也可以处理这些情况。
如果不匹配的项目问题源自宏代码在运行时生成的代码,因此在源程序中不存在,则我会打开选项mfile将生成的数据步骤代码写入文件,然后运行perl脚本来处理该代码。

我选择Perl是因为它具有强大的模式匹配能力,但任何其他模式匹配语言都可以很好地工作。希望这可以帮到你。


1

我遇到了一个宏中引号不平衡的情况,唯一的解决方法是关闭SAS实例并重新开始。

我认为这是SAS中不可接受的缺陷。

然而,我使用了#2和#5两种方法,它们都起作用了。先使用#2,然后使用#1。我将它们放在所有代码之上,包括我的代码头,解释了这个程序正在做什么。

效果非常好。


1
这对我几乎每次都有效:

; *'; *"; */;
ODS _ALL_ CLOSE;
quit; run; %MEND;
data _NULL_; putlog "DONE"; run;

0
关闭 SAS 会话在我的情况下起作用。在尝试此处提到的其他方法之前,我认为您可以尝试一次这个方法。

0

您可以随时发出终止已提交语句的命令并重新提交要运行的内容。


0

只是想重申AFHood的建议,使用ODS _ALL_ CLOSE;语句。这是一个关键的语句需要包含。并且确保每次完成ODS操作后都要使用它。


-1

是的,我相信官方的SAS文档也推荐了你提出的解决方案。


我相信已经看到过一些包含“run;”和/或“quit;”的单行解决方案,所以我想知道我的示例是否完整。 - Martin Bøgelund

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接