京公网安备 11010802034615号
经营许可证编号:京B2-20210330
SAS程序错误及处理
通常我们所开发的SAS程序,很少在第一次提交时就能够运行完成并产生正确结果。程序越长越复杂,就越可能出现语法或逻辑错误。本文介绍了一些良好的SAS编程规范以减少程序错误,同时也描述了几种常见的错误及错误发生后对应的处理方法。
良好的SAS编程风格
在开发SAS程序的过程中,遵循下面几条规则可以使程序出错的几率变小,并帮助发现错误。
(1)提高程序的易读性
一个简单的方式是在开发程序时保持代码的整洁和一致。易读的程序会更易于调试,长期来看会节省时间。在编写SAS程序时可遵循如下建议以提高程序的易读性:
每行一条SAS语句。SAS允许在一行写多个SAS语句,这样会节省代码空间,但是这些空间会以损失程序的易读性为代价。
(2)测试程序每个部分
在开始写下一部分的代码之前,先测试前面已经完成的代码,保证已经完成的代码运行正确会极大地提高开发效率。
如果是从外部数据文件读取数据到SAS数据集,则使用PROC PRINT打印SAS数据集或数据集的部分数据,以保证该数据集被正确生成。有时,在日志中可能没有错误或可疑的提示,而所生成的数据集却是不正确的。这是因为所开发的代码可能并没有如预期的读取数据,或原始数据本身存在某些在开发代码时没有意识到的问题。对此,好的习惯是,对程序创建的所有SAS数据集都至少要打印一次,以进行检查。
(3)正式运行程序前使用较小的数据集测试程序
有时,使用全部数据测试程序是不现实的。如果数据文件特别大,测试所有的数据会很费时,这时可以使用数据的子集来进行测试。
如果是从文件中读取数据,可以在INFILE语句中使用OBS=告诉SAS读取文件中的前多少行,例如前50、前100行或更多,只要能代表要读取的数据就行。下面的代码仅仅读取文件的前100行:
还可以使用选项FIRSTOBS=指定从文件的中间部分开始读取数据。例如,下面的语句读取customer.dat文件的第101行到第200行:
同样选项FIRSTOBS=和OBS=也可以用于在SET语句中读取该数据集中对应的观测。下面的代码会读取数据集saslib.customer中的第101到第200个观测。
关于SET语句及数据集选项,下面文章会详细介绍。
(4)使用语法敏感的编辑器
在Windows操作系统下,增强型编辑器(Enhanced Editor)是默认的编辑器,在其他操作系统下,程序编辑器(Program Editor)是默认编辑器。这两种编辑器都会对代码的不同部分自动添加颜色,例如SAS关键字是一种颜色,变量是另一种颜色。此外,所有引号中的文本也是同样的颜色,这样我们可以很容易区分是否存在引号不匹配的情况。类似地,遗漏分号也很容易发现,因为分号遗漏可能会导致接下来的代码颜色不正确。
常见错误及处理
SAS程序提交执行后会在日志窗口或日志文件中产生代码运行的信息。我们可以根据日志信息确定什么时候程序发生错误,并获取信息纠正错误。SAS通常会识别四类错误:
SAS检测到错误时,通常会将错误或检测到错误的位置加下划线,并显示一个数字。每个数字与一条错误消息唯一关联。接着SAS进入语法检查模式,它会读取剩下的程序语句、检查语法,并在其他错误位置加下划线。
在批处理或非交互式的程序中,DATA步中的错误会导致SAS对剩下的程序一直处于语法检查模式,其他任何创建外部文件或SAS数据集的DATA或PROC步都不会执行。然而,读SAS数据集的过程会执行,但是读入的观测数会为0,而不读SAS数据集的过程正常执行。通常PROC步中的语法错误仅仅影响当前PROC步。在该PROC步结束时,SAS会将检测到的每个错误写入SAS日志。
语法错误
有些语法错误从日志窗口中很容易理解并改正,有时SAS还会自动纠正并提示警告信息,例如在图2.50中展示的是关键字拼写错误。关键字INPUT错误拼写为INYUT,SAS给出警告信息并将该拼错的词理解为INPUT。这样,编译会通过,代码也会正确执行。但SAS并不负责将代码中的错误改正,需要开发人员自己修正。
图2.50 关键字拼写错误
很多语法错误是由于遗漏分号(;)导致的,根据其在日志窗口的消息,可能没那么容易找到出错原因。在下面的代码中,DATA语句指定了数据集名称之后遗漏分号(;)。
提交代码执行时,因为遗漏分号,SAS认为DATA语句中没有结束,length和Name都被当作数据集名。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程序运行不结束
遇到的这样的问题,建议先提交下列代码将引号配对,从而使程序完成执行过程,再来检查修正程序的错误。这三行代码除了可以解决不匹配的单引号和双引号外,还可以解决不匹配的注释标记,以及遗漏分号、QUIT或RUN语句的问题:
结语
“读取外部数据到SAS数据集”系列文章首先介绍了SAS编程的基本概念,具体包括SAS逻辑库、SAS数据集、SAS数据集管理、系统选项以及SAS程序结构等内容;在此基础上介绍了DATA步处理数据的原理,重点讲解了如何使用DATA步的各种输入方式来读取不同格式的外部文件中的数据,并创建数据集;接下来介绍了如何运用IMPORT过程读取外部的数据文件,以及如何通过LIBNAME语句和PROC SQL访问关系型数据集库系统中的数据;最后,还介绍了SAS程序开发中常见的几种错误现象及其处理方法。
程序的不同部分使用相应的缩进。缩进DATA步和PROC步中的所有语句,这种方式会很容易得知程序中有多少个DATA和PROC步,并且知道那些语句属于哪个过程步。
代码中引用的所有SAS文件都使用二级名称,例如work.customer,即使该SAS文件存储在WORK临时逻辑库或USER逻辑库中。
使用RUN或QUIT语句显式地表明DATA步或PROC步结束。虽然SAS会在遇到下一个DATA步或PROC步时自动认为当前过程步结束,但是RUN或QUIT语句会让程序块逻辑更清楚。
使用注释说明程度代码段。给程序添加注释可能会花一些额外的时间,但是很多时候注释很重要,尤其是当其他人查看或使用代码时。
语法错误。语法错误是在SAS语句中犯的错误,包括单词误拼写、遗漏或无效的标点符号、无效的语句或数据集选项等。
执行时错误。当程序提交执行时,执行时错误会让程序失败。大多数不严重的执行时错误会在SAS日志中产生提示消息,但是程序能继续运行。但如果是更严重的错误,SAS会打印错误消息并停止处理。
数据错误。数据错误是一种执行时错误。当SAS程序正在分析的原始数据包含无效值时就会发生数据错误。例如,INPUT语句中指定了数字变量,而原始数据记录中的数据值是字符。数据错误不会引起程序停止,但是会在SAS日志中产生提示信息。
语义错误。语义错误是另一种执行时错误,当SAS语句形式是正确的,但有些选项或语句等的使用方式无效时会发生。例如,函数中指定的参数个数错误、在只有字符变量有效的地方使用数字变量名或使用了没有赋值的逻辑库引用名等。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
【核心关键词】客户、数据分析、指标体系、数据采集、数据指标、业务数据、分析思路、业务需求、分析方法 【专访摘要】本次 CDA ...
2026-07-24在数据分析、业务建模与数字化运营体系中,原始业务数据普遍存在缺失、重复、异常、口径不一致等质量问题,直接用于分析与建模会 ...
2026-07-24 很多数据分析师能熟练计算均值、标准差,但当被问到“如何用一张图让业务方3秒内看懂核心结论”“面对不同数据类型该怎么选 ...
2026-07-24在数据驱动的精细化运营体系中,指标是业务判断、效果复盘、策略优化的核心依据。随着企业数据化程度提升,指标数量持续膨胀,但 ...
2026-07-23在用户运营与产品增长体系中,留存是衡量产品真实价值与用户粘性的核心标尺,也是决定用户生命周期价值、获客投产比的底层因素。 ...
2026-07-23 很多数据分析师精通Excel、SQL、Python等工具,但当被问到“面对一个具体的业务问题,该用什么分析方法”“描述性分析和诊断 ...
2026-07-23【核心关键词】埋点、产品、互联网、数据库、决策、数据分析、产品经理、商业模式、移动互联网、指标体系、运营模块、大数据平 ...
2026-07-22在高并发、大数据量的业务系统中,单表数据量达到千万级甚至亿级后,会出现查询性能骤降、索引维护成本飙升、存储扩容困难等问题 ...
2026-07-22 很多企业团队并非缺乏指标,而是陷入“指标失控”:仪表盘上堆满实时跳动的数据,却无法回答“当前瓶颈在哪、下一步该做什么 ...
2026-07-22在金融风控、企业运营、行业研究等数据分析场景中,大量数据以面板数据形态存在:例如多家分支机构连续多个季度的风险指标、多位 ...
2026-07-21 很多数据分析师每天都在计算指标、制作报表,但当被问到“什么叫指标数据元”“指标数据标准包含哪些核心维度”“指标数据质 ...
2026-07-21一、活动介绍 2026暑期CDA备考冲刺季,为想利用假期拿证的你量身打造。考点胶囊内容搭配多重硬核福利,让你在旅行、实习、居家 ...
2026-07-21金融行业的运营风险贯穿业务全流程,涵盖交易欺诈、操作违规、流程漏洞、合规偏差、客户信用异常等多元场景,是银行、保险、证券 ...
2026-07-17财产保险作为金融行业的核心板块,涵盖车险、家财险、责任险、企财险等多元品类,是个人与企业抵御财产风险、经营风险的重要保障 ...
2026-07-17 很多数据分析师能熟练写SQL、做透视表,但当被问到“数据是从哪里来的?经过哪些加工才进入数据仓库?ETL具体做了什么?”时 ...
2026-07-17【核心关键词】模块、餐饮、客户、门店、企业、订单、供应链、多样化、产品、生产计划、数据分析、生产管理、物料管理、业务分 ...
2026-07-16在数字化分析时代,原始数据本身不具备业务价值,只有通过科学的统计学方法加工、拆解、验证与解读,才能挖掘数据背后的规律、差 ...
2026-07-16 很多数据分析师能熟练地写SQL、做透视表、算描述性统计,但当被问到“如何预测用户流失概率”“如何归因销量下滑的关键因素 ...
2026-07-16在描述性统计分析、数据预处理、异常值排查与多组数据分布对比工作中,箱线图(Box Plot)是应用最广泛的可视化与统计工具之一。 ...
2026-07-15在企业数据存储、业务统计与数据分析工作中,绝大多数业务数据都带有时间维度属性,例如订单创建时间、用户注册时间、支付完成时 ...
2026-07-15