2023年11月28日发(作者:)

SAS程序错误及处理

本⽂转⾃SAS知识 ID: SASadvisor),摘⾃《深⼊解析SAS — 数据处理、分析优化与商业应⽤

回复「朝阳35处」可查看「说⼈话的⼤数据」系列合辑

上⼀篇⽂章,我们介绍了访问关系型数据库系统中的数据,今天我们介绍“SAS程序错误及处理

通常我们所开发的SAS程序,很少在第⼀次提交时就能够运⾏完成并产⽣正确结果。程序越长越复杂,就越可能出现语

法或逻辑错误。本⽂介绍了⼀些良好的SAS编程规范以减少程序错误,同时也描述了⼏种常见的错误及错误发⽣后对应

的处理⽅法。

良好的SAS编程风格

在开发SAS程序的过程中,遵循下⾯⼏条规则可以使程序出错的⼏率变⼩,并帮助发现错误。

1)提⾼程序的易读性

⼀个简单的⽅式是在开发程序时保持代码的整洁和⼀致。易读的程序会更易于调试,长期来看会节省时间。在编写SAS

程序时可遵循如下建议以提⾼程序的易读性:

每⾏⼀条SAS语句。SAS允许在⼀⾏写多个SAS语句,这样会节省代码空间,但是这些空间会以损失程序的易读性

为代价。

程序的不同部分使⽤相应的缩进。缩进DATA步和PROC步中的所有语句,这种⽅式会很容易得知程序中有多少个

DATAPROC步,并且知道那些语句属于哪个过程步。

代码中引⽤的所有SAS⽂件都使⽤⼆级名称,例如er,即使该SAS⽂件存储在WORK临时逻辑库或

USER逻辑库中。

使⽤RUNQUIT语句显式地表明DATA步或PROC步结束。虽然SAS会在遇到下⼀个DATA步或PROC步时⾃动认

为当前过程步结束,但是RUNQUIT语句会让程序块逻辑更清楚。

使⽤注释说明程度代码段。给程序添加注释可能会花⼀些额外的时间,但是很多时候注释很重要,尤其是当其他⼈

查看或使⽤代码时。

2)测试程序每个部分

在开始写下⼀部分的代码之前,先测试前⾯已经完成的代码,保证已经完成的代码运⾏正确会极⼤地提⾼开发效率。

如果是从外部数据⽂件读取数据到SAS数据集,则使⽤PROC PRINT打印SAS数据集或数据集的部分数据,以保证该

数据集被正确⽣成。有时,在⽇志中可能没有错误或可疑的提⽰,⽽所⽣成的数据集却是不正确的。这是因为所开发的

代码可能并没有如预期的读取数据,或原始数据本⾝存在某些在开发代码时没有意识到的问题。对此,好的习惯是,对

程序创建的所有SAS数据集都⾄少要打印⼀次,以进⾏检查。

3)正式运⾏程序前使⽤较⼩的数据集测试程序

有时,使⽤全部数据测试程序是不现实的。如果数据⽂件特别⼤,测试所有的数据会很费时,这时可以使⽤数据的⼦集

有时,使⽤全部数据测试程序是不现实的。如果数据⽂件特别⼤,测试所有的数据会很费时,这时可以使⽤数据的⼦集

来进⾏测试。

如果是从⽂件中读取数据,可以在INFILE语句中使⽤OBS=告诉SAS读取⽂件中的前多少⾏,例如前50、前100⾏或更

多,只要能代表要读取的数据就⾏。下⾯的代码仅仅读取⽂件的前100⾏:

还可以使⽤选项FIRSTOBS=指定从⽂件的中间部分开始读取数据。例如,下⾯的语句读取⽂件的第101

到第200⾏:

同样选项FIRSTOBS=OBS=也可以⽤于在SET语句中读取该数据集中对应的观测。下⾯的代码会读取数据集

er中的第101到第200个观测。

关于SET语句及数据集选项,下⾯⽂章会详细介绍。

4)使⽤语法敏感的编辑器

Windows操作系统下,增强型编辑器(Enhanced Editor)是默认的编辑器,在其他操作系统下,程序编辑器

Program Editor)是默认编辑器。这两种编辑器都会对代码的不同部分⾃动添加颜⾊,例如SAS关键字是⼀种颜⾊,

变量是另⼀种颜⾊。此外,所有引号中的⽂本也是同样的颜⾊,这样我们可以很容易区分是否存在引号不匹配的情况。

类似地,遗漏分号也很容易发现,因为分号遗漏可能会导致接下来的代码颜⾊不正确。

常见错误及处理

SAS程序提交执⾏后会在⽇志窗⼝或⽇志⽂件中产⽣代码运⾏的信息。我们可以根据⽇志信息确定什么时候程序发⽣错

误,并获取信息纠正错误。SAS通常会识别四类错误:

语法错误。语法错误是在SAS语句中犯的错误,包括单词误拼写、遗漏或⽆效的标点符号、⽆效的语句或数据集选

项等。

执⾏时错误。当程序提交执⾏时,执⾏时错误会让程序失败。⼤多数不严重的执⾏时错误会在SAS⽇志中产⽣提⽰

消息,但是程序能继续运⾏。但如果是更严重的错误,SAS会打印错误消息并停⽌处理。

数据错误。数据错误是⼀种执⾏时错误。当SAS程序正在分析的原始数据包含⽆效值时就会发⽣数据错误。例

如,INPUT语句中指定了数字变量,⽽原始数据记录中的数据值是字符。数据错误不会引起程序停⽌,但是会在

SAS⽇志中产⽣提⽰信息。

语义错误。语义错误是另⼀种执⾏时错误,当SAS语句形式是正确的,但有些选项或语句等的使⽤⽅式⽆效时会发

⽣。例如,函数中指定的参数个数错误、在只有字符变量有效的地⽅使⽤数字变量名或使⽤了没有赋值的逻辑库引

⽤名等。

SAS检测到错误时,通常会将错误或检测到错误的位置加下划线,并显⽰⼀个数字。每个数字与⼀条错误消息唯⼀关

联。接着SAS进⼊语法检查模式,它会读取剩下的程序语句、检查语法,并在其他错误位置加下划线。

在批处理或⾮交互式的程序中,DATA步中的错误会导致SAS对剩下的程序⼀直处于语法检查模式,其他任何创建外部

⽂件或SAS数据集的DATAPROC步都不会执⾏。然⽽,读SAS数据集的过程会执⾏,但是读⼊的观测数会为0,⽽

不读SAS数据集的过程正常执⾏。通常PROC步中的语法错误仅仅影响当前PROC步。在该PROC步结束时,SAS会将

检测到的每个错误写⼊SAS⽇志。

语法错误

有些语法错误从⽇志窗⼝中很容易理解并改正,有时SAS还会⾃动纠正并提⽰警告信息,例如在图2.50中展⽰的是关键

字拼写错误。关键字INPUT错误拼写为INYUTSAS给出警告信息并将该拼错的词理解为INPUT。这样,编译会通过,

字拼写错误。关键字INPUT错误拼写为INYUTSAS给出警告信息并将该拼错的词理解为INPUT。这样,编译会通过,

代码也会正确执⾏。但SAS并不负责将代码中的错误改正,需要开发⼈员⾃⼰修正。

2.50 关键字拼写错误

很多语法错误是由于遗漏分号(;)导致的,根据其在⽇志窗⼝的消息,可能没那么容易找到出错原因。在下⾯的代码

中,DATA语句指定了数据集名称之后遗漏分号(;)。

提交代码执⾏时,因为遗漏分号,SAS认为DATA语句中没有结束,lengthName都被当作数据集名。SAS⽆法解释

接下来出现的$,所以认为出错。SAS在⽇志中显⽰了如图2.51所⽰的信息:在$出现的地⽅加划线,并给出期待在这个

地⽅出现的名称或符号,并提⽰出错。

2.51 遗漏分号

这时需要通过在DATA语句数据集名称之后添加分号(;)来修正该段代码。

数据错误

在下⾯的程序中,INPUT语句使⽤列表⽅式读取数据值。要读取的最后⼀个变量为数字型变量,但输⼊数据中第三⾏记

录的最后⼀个字段为字符。

提交执⾏后查看⽇志窗⼝信息,如图2.52所⽰。SAS提⽰在第10~13列(因为是列表输⼊⽅式,所以要赋值给Price

“five”,对应于第10~13列)的数据对变量Price⽆效。为了便于分析和修正,SAS还在⽇志窗⼝列出了输⼊缓冲区的

值、PDV中各变量的值,包括DATA步中定义的变量和⾃动变量_ERROR__N_等。该数据错误只是会导致所⽣成的

观测中存在缺失值,DATA步并不会停⽌执⾏。

2.52 数据错误

对于这样的问题,有多种处理⽅式。在本例中可以不作处理,因为它只是会导致观测中存在缺失值。其他类似的情况,

可以通过调整输⼊⽅式,例如使⽤格式化输⼊等⽅法来解决。

语义错误

在下⾯的程序中,DATA步读取外部数据⽂件,并指定⽂件中字段值之间的分隔符为逗号(,)。注意,其中INFILE语句

的选项DLM=误写为DLMA=了。

提交程序执⾏后查看⽇志窗⼝的信息,如图2.53所⽰。SAS提⽰选项名称DLMA⽆效。因为出错,SAS停⽌处理并创建

没有观测值的数据集。

2.53 语义错误

这时需要更正该选项名称为DLM=,并再次提交执⾏。

引号不配对

在执⾏SAS程序时,有时会出现⽐较意外的情况。例如提交了代码后,并不产⽣任何结果,⽇志窗⼝仅显⽰代码信息,

没有对应的SAS语句执⾏提⽰信息。不知道SAS在⼲什么,有时编辑器窗⼝会⼀直表⽰PROC步正在运⾏。这时⾸先需

要检查是不是存在代码中引号不配对的问题。

要检查是不是存在代码中引号不配对的问题。

在下⾯的代码中,FILNAME语句指定⽂件引⽤时,⽂件名结束后遗漏了对应的单引号(')。

提交代码执⾏,并查看⽇志窗⼝,有原始代码,但没有语句执⾏提⽰信息,如图2.54所⽰。

2.54 SAS程序运⾏不结束

遇到的这样的问题,建议先提交下列代码将引号配对,从⽽使程序完成执⾏过程,再来检查修正程序的错误。这三⾏代

码除了可以解决不匹配的单引号和双引号外,还可以解决不匹配的注释标记,以及遗漏分号、QUITRUN语句的问

题:

结语

读取外部数据到SAS数据集系列⽂章⾸先介绍了SAS编程的基本概念,具体包括SAS逻辑库、SAS数据集、SAS数据

集管理、系统选项以及SAS程序结构等内容;在此基础上介绍了DATA步处理数据的原理,重点讲解了如何使⽤DATA

步的各种输⼊⽅式来读取不同格式的外部⽂件中的数据,并创建数据集;接下来介绍了如何运⽤IMPORT过程读取外部

的数据⽂件,以及如何通过LIBNAME语句和PROC SQL访问关系型数据集库系统中的数据;最后,还介绍了SAS程序

开发中常见的⼏种错误现象及其处理⽅法。

下⼀篇⽂章开始介绍对单个数据集的处理

查询往期⽂章,请回复下列关键字:

【安全】==>SAS智能平台安全管理】系列⽂章

Base基础】==>Base SAS基础】系列⽂章

【编程概念】==>SAS编程基本概念】系列⽂章

⼩贴⼠

读者可以从以下链接获取SAS公司提供的免费版环境:

SAS⼤学版(SAS® University Edition)是SAS为在校⼤学⽣免费提供的基于虚拟机和⽹页的SAS环境。

下载路径:

SAS学术版(SAS® OnDemand for Academics)是 SAS 为学术届⼈⼠免费提供的、在线的、基于SAS 私有云上的应

⽤服务环境。

⽤户⾸先需要注册,然后按照提⽰信息就可登录。

注册路径:

本⽂转⾃《深⼊解析SAS — 数据处理、分析优化与商业应⽤

作者:夏坤庄、徐唯、潘红莲、林建伟

如若转载本⽂,请在⽂章顶部标注本⽂转⾃SAS知识 ID: SASAdvisor),摘⾃《深⼊解析SAS — 数据处理、分析

优化与商业应⽤

作者介绍

夏坤庄

《深⼊解析SAS — 数据处理、分析优化与商业应⽤》第⼀作者, SAS软件研究开发(北京)有限公司客户职能部总

监。在承担研发⼯作的同时,夏及其团队负责对SAS⾮英语市场提供技术⽀持,并且与在美国及其它地区的团队⼀起,

服务于SASSaaS/RaaS业务,同时提供和验证关于SAS产品和技术在应⽤领域的最佳实践。在加⼊SAS软件研究开

发(北京)有限公司之前,夏就职于SAS中国公司,历任资深咨询顾问、项⽬经理、⾸席顾问、咨询经理,拥有丰富的

咨询和项⽬实施经验。在长期的从业经历中,不但为SAS的⾦融⾏业客户成功实施了众多深受好评的项⽬,⽽且在近年

领导实施了⾮⾦融⾏业的多个⼤数据分析项⽬。

SAS知识 微信:SASAdvisor 长按⼆维码关注

欢迎⼤家投稿,⼀起分享SAS的点滴

投稿邮箱:**********************

3⽉原创好⽂回顾,请点击阅读: