《深入解析sas:数据处理、分析优化与商业应用》一2.5 SAS程序错误及处理

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
云解析DNS,个人版 1个月
云解析 DNS,旗舰版 1个月
简介: 本节书摘来自华章出版社《高并发Oracle数据库系统的架构与设计》一书中的第2章,第2.5节,作者 侯松,更多章节内容可以访问云栖社区“华章计算机”公众号查看 2.5 SAS程序错误及处理 通常我们所开发的SAS程序,很少在第一次提交时就能够运行完成并产生正确结果。

本节书摘来自华章出版社《深入解析sas:数据处理、分析优化与商业应用》一书中的第2章,第2.5节,作者 夏坤庄 徐唯 潘红莲 林建伟,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.5 SAS程序错误及处理

通常我们所开发的SAS程序,很少在第一次提交时就能够运行完成并产生正确结果。程序越长、越复杂,就越可能出现语法错误或逻辑错误。本节介绍了一些良好的SAS编程规范以减少程序错误,同时也描述了几种常见的错误及错误发生后的处理方法。

2.5.1 良好的SAS编程风格

在开发SAS程序的过程中,遵循下面几条规则可以减小程序出错的几率,并有助于发现错误。
(1)提高程序的易读性
一个简单的方式是在开发程序时保持代码的整洁和一致。易读的程序会更易于调试,长期来看会节省时间。在编写SAS程序时可遵循如下建议以提高程序的易读性:
每行一条SAS语句。SAS允许在一行中写多个SAS语句,这样会节省代码空间,但是这些空间会以损失程序的易读性为代价。
程序的不同部分使用相应的缩进。缩进DATA步和PROC步中的所有语句,这种方式会很容易得知程序中有多少个DATA步和PROC步,并且知道那些语句属于哪个过程步。
代码中引用的所有SAS文件都使用二级名称,例如work.customer,即使该SAS文件存储在WORK临时逻辑库或USER逻辑库中也应如此。
使用RUN或QUIT语句显式地表明DATA步或PROC步结束。虽然SAS会在遇到下一个DATA步或PROC步时自动结束当前过程步,但是RUN或QUIT语句会让程序块的逻辑更清楚。
使用注释说明程序代码段。给程序添加注释可能会花一些额外的时间,但是很多时候注释很重要,尤其是当其他人查看或使用代码时。
(2)测试程序的每个部分
在开始写下一部分的代码之前,先测试前面已经完成的代码。保证已经完成的代码运行正确会极大地提高开发效率。
如果是从外部数据文件读取数据到SAS数据集,则使用PROC PRINT打印SAS数据集或数据集的部分数据,以保证该数据集被正确生成。有时,在日志中可能没有错误或可疑的提示,但所生成的数据集却是不正确的。这是因为所开发的代码可能并没有如预期的那样读取数据,或原始数据本身存在某些在开发代码时没有意识到的问题。对此,好的习惯是,对程序创建的所有SAS数据集都至少要打印一次,以进行检查。
(3)正式运行程序前使用子数据集测试程序
有时,使用全部数据测试程序是不现实的。如果数据文件特别大,测试所有的数据会很费时,这时可以使用数据的子集来进行测试。
如果是从文件中读取数据,可以在INFILE语句中使用OBS=告诉SAS读取文件中的前多少行,例如前50、前100行等,只要能代表要读取的数据就行。下面的代码仅仅读取文件的前100行。

infile 'customer.dat' obs=100;

还可以使用选项FIRSTOBS=指定从文件的中间部分开始读取数据。例如,下面的语句读取customer.dat文件的第101行到第200行。

infile 'customer.dat' firstobs=101 obs=200;

同样,选项FIRSTOBS=和OBS=也可以用于在SET语句中读取该数据集中对应的观测。下面的代码会读取数据集saslib.customer中的第101~200个观测。

set saslib.customer (firstobs=101 obs=200);

关于SET语句及数据集选项,本书下一章会详细介绍。
(4)使用语法敏感的编辑器
在Windows操作系统下,增强型编辑器(Enhanced Editor)是默认的编辑器,在其他操作系统下,程序编辑器(Program Editor)是默认编辑器。这两种编辑器都会对代码的不同部分自动添加颜色,例如SAS关键字是一种颜色,变量是另一种颜色。此外,所有引号中的文本也是同样的颜色,这样我们可以很容易区分是否存在引号不匹配的情况。类似地,遗漏分号也很容易发现,因为遗漏分号可能会导致接下来的代码颜色不正确。

2.5.2 常见错误及处理

SAS程序提交执行后会在日志窗口或日志文件中产生代码运行的信息。我们可以根据日志信息确定什么时候程序发生错误,并获取信息纠正错误。SAS通常会识别以下4类错误:
语法错误。语法错误是在SAS语句中犯的错误,包括单词拼写错、遗漏或无效的标点符号、无效的语句或数据集选项等。
执行时错误。当程序提交执行时,执行时错误会让程序失败。大多数不严重的执行时错误会在SAS日志中产生提示消息,但是程序还能继续运行。如果是更严重的错误,SAS会打印错误消息并停止处理。
数据错误。数据错误是一种执行时错误。当SAS程序正在分析的原始数据包含无效值时就会发生数据错误。例如,INPUT语句中指定了数字变量,而原始数据记录中的数据值是字符。数据错误不会引起程序停止,但是会在SAS日志中产生提示信息。
语义错误。语义错误是另一种执行时错误,当SAS语句形式是正确的,但有些选项或语句等的使用方式无效时会发生。例如,函数中指定的参数个数错误、在只有字符变量有效的地方使用数字变量名或使用了没有赋值的逻辑库引用名等。
SAS检测到错误时,通常会将错误或检测到错误的位置加下划线,并显示一个数字。每个数字与一条错误消息唯一关联。接着SAS进入语法检查模式,它会读取剩下的程序语句、检查语法,并在其他错误位置加下划线。
在批处理或非交互式的程序中,DATA步中的错误会导致SAS对剩下的程序一直处于语法检查模式,其他任何创建外部文件或SAS数据集的DATA步或PROC步都不会执行。然而,读SAS数据集的过程会执行,但是读入的观测数会为0,而不读SAS数据集的过程正常执行。通常PROC步中的语法错误仅仅影响当前PROC步。在该PROC步结束时,SAS会将检测到的每个错误写入SAS日志。
1.?语法错误
有些语法错误从日志窗口中很容易理解并改正,有时SAS还会自动纠正并提示警告信息,例如在图2.50中展示的是关键字拼写错误。关键字INPUT错误拼写为INYUT,SAS给出警告信息并将该拼错的词理解为INPUT。这样,编译会通过,代码也会正确执行。但SAS并不负责将代码中的错误改正,需要开发人员自己修改。
很多语法错误是由于遗漏分号(;)导致的,根据其在日志窗口的消息,可能没那么容易找到出错原因。在下面的代码中,DATA语句指定了数据集名称之后遗漏分号(;)。

data saslib.customer
    length Name $20 Address $40;
    infile extfiles(customer_dsd) dsd;
    input Customer_ID $ Name $ Address $;
run;

提交代码执行时,因为遗漏分号,SAS认为DATA语句中没有结束,length和Name都被当作数据集名。SAS无法解释接下来出现的$,所以认为出错。SAS在日志中显示的信息如图2.51所示。在$出现的地方加划线,给出期待在这个地方出现的名称或符号,并提示出错。

image

这时需要通过在DATA语句数据集名称之后添加分号(;)来改正该段代码。
2.?数据错误
在下面的程序中,INPUT语句使用列表方式读取数据值。要读取的最后一个变量为数值型变量,但输入数据中第三行记录的最后一个字段为字符。

data saslib.inventory;
    input Product_ID $ Instock Price;
    Cost=Price*0.15;
    datalines;
P001R 12 125.00
P003T 34 40.00
P301M 23 five hundred
PC02M 12 100.00
;
run;

提交执行后查看日志窗口信息,如图2.52所示。SAS提示在第10~13列(因为是列表输入方式,所以要赋值给Price的是five,对应于第10~13列)的数据对变量Price无效。为了便于分析和修正,SAS还在日志窗口列出了输入缓冲区的值、PDV中各变量的值,包括DATA步中定义的变量和自动变量_ERROR_和_N_等。该数据错误只是会导致所生成的观测中存在缺失值,DATA步并不会停止执行。

image

对于这样的问题,有多种处理方式。在本例中可以不作处理,因为它只会导致观测中存在缺失值。其他类似的情况,可以通过调整输入方式,例如使用格式化输入等方法来解决。
3.?语义错误
在下面的程序中,DATA步读取外部数据文件,并指定文件中字段值之间的分隔符为逗号(,)。注意,其中INFILE语句的选项DLM=误写为DLMA=了。

data saslib.Inventory;
    infile invtfile dlma=',';
    input Product_ID $ Instock Price;
run;

提交程序执行后查看日志窗口的信息,如图2.53所示。SAS提示选项名称DLMA无效。因为出错,SAS停止处理并创建没有观测值的数据集。

image

这时需要更正该选项名称为DLM=,并再次提交执行。
4.?引号不配对
在执行SAS程序时,有时会出现比较意外的情况。例如提交了代码后,并不产生任何结果,日志窗口仅显示代码信息,没有对应的SAS语句执行提示信息,不知道SAS在干什么,有时编辑器窗口会一直表示PROC步正在运行。这时首先需要检查是不是存在代码中引号不配对的问题。
在下面的代码中,FILNAME语句指定文件引用时,文件名结束后遗漏了对应的单引号(')。

filename customfl 'c:\sas\data\customer_dsd.dat;

data saslib.customer
    length Name $20 Address $40;
    infile customfl dsd;
    input Customer_ID $ Name $ Address $;
run;

proc print data=saslib.customer noobs;
run;

提交代码执行,并查看日志窗口,有原始代码,但没有语句执行提示信息,如图2.54所示。

image

遇到的这样的问题,建议先提交下列代码将引号配对,从而使程序完成执行过程,再来检查修正程序的错误。这3行代码除了可以解决单引号和双引号不匹配的问题以外,还可以解决注释标记不匹配,以及遗漏分号、QUIT或RUN语句的问题。

/* '; * "; */; 
quit; 
run;
相关文章
|
3天前
|
C# Android开发 开发者
Uno Platform 高级定制秘籍:深度解析与实践样式和模板应用,助你打造统一且高效的跨平台UI设计
【9月更文挑战第7天】Uno Platform 是一个强大的框架,支持使用 C# 和 XAML 创建跨平台 UI 应用,覆盖 Windows、iOS、Android、macOS 和 WebAssembly。本文介绍 Uno Platform 中样式和模板的应用,助力开发者提升界面一致性与开发效率。样式定义控件外观,如颜色和字体;模板则详细定制控件布局。通过 XAML 定义样式和模板,并可在资源字典中全局应用或嵌套扩展。合理利用样式和模板能简化代码、保持设计一致性和提高维护性,帮助开发者构建美观高效的跨平台应用。
10 1
|
4天前
|
XML 存储 数据格式
RAG效果优化:高质量文档解析详解
本文关于如何将非结构化数据(如PDF和Word文档)转换为结构化数据,以便于RAG(Retrieval-Augmented Generation)系统使用。
|
7天前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
73 1
|
9天前
|
监控 安全 网络安全
恶意软件分析:解析与实践指南
【8月更文挑战第31天】
28 0
|
9天前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
55 0
|
9天前
|
开发者 图形学 iOS开发
掌握Unity的跨平台部署与发布秘籍,让你的游戏作品在多个平台上大放异彩——从基础设置到高级优化,深入解析一站式游戏开发解决方案的每一个细节,带你领略高效发布流程的魅力所在
【8月更文挑战第31天】跨平台游戏开发是当今游戏产业的热点,尤其在移动设备普及的背景下更为重要。作为领先的游戏开发引擎,Unity以其卓越的跨平台支持能力脱颖而出,能够将游戏轻松部署至iOS、Android、PC、Mac、Web及游戏主机等多个平台。本文通过杂文形式探讨Unity在各平台的部署与发布策略,并提供具体实例,涵盖项目设置、性能优化、打包流程及发布前准备等关键环节,助力开发者充分利用Unity的强大功能,实现多平台游戏开发。
25 0
|
9天前
|
定位技术
|
9天前
|
开发者 图形学 UED
深度解析Unity游戏开发中的性能瓶颈与优化方案:从资源管理到代码执行,全方位提升你的游戏流畅度,让玩家体验飞跃性的顺滑——不止是技巧,更是艺术的追求
【8月更文挑战第31天】《Unity性能优化实战:让你的游戏流畅如飞》详细介绍了Unity游戏性能优化的关键技巧,涵盖资源管理、代码优化、场景管理和内存管理等方面。通过具体示例,如纹理打包、异步加载、协程使用及LOD技术,帮助开发者打造高效流畅的游戏体验。文中提供了实用代码片段,助力减少内存消耗、提升渲染效率,确保游戏运行丝滑顺畅。性能优化是一个持续过程,需不断测试调整以达最佳效果。
23 0
|
9天前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
27 0
|
9天前
|
区块链 C# 存储
链动未来:WPF与区块链的创新融合——从智能合约到去中心化应用,全方位解析开发安全可靠DApp的最佳路径
【8月更文挑战第31天】本文以问答形式详细介绍了区块链技术的特点及其在Windows Presentation Foundation(WPF)中的集成方法。通过示例代码展示了如何选择合适的区块链平台、创建智能合约,并在WPF应用中与其交互,实现安全可靠的消息存储和检索功能。希望这能为WPF开发者提供区块链技术应用的参考与灵感。
23 0

热门文章

最新文章

推荐镜像

更多
下一篇
DDNS