SAS调试技巧.docx
- 文档编号:14938335
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:13
- 大小:161.96KB
SAS调试技巧.docx
《SAS调试技巧.docx》由会员分享,可在线阅读,更多相关《SAS调试技巧.docx(13页珍藏版)》请在冰点文库上搜索。
SAS调试技巧
SAS调试技巧
对于每一个编程者来说,都会碰到BUG问题,一个有经验的编程者则能尽量避免错误发生,同时,在碰到问题,能够有效利用软件的相关调试功能,及时发现、定位和解决问题。
对于SAS来说,专门讲调试的书籍很少,通过这章内容,希望使读者能够掌握基本的SAS的调试技巧。
SAS错误类型概述
SAS错误类型包括:
语法错、词义错、运行错、数据错和宏相关错误。
SAS在编译和运行过程中都执行错误检查,在每个语句执行之前编译各步时候SAS可以发现语法错、词义错和部分宏错误,在程序执行过程中可以发现其他错误。
错误类型
错误发生地点
错误检查环节
语法
程序语句不符合SAS语言规范
编译环节
词义
程序语句的元素格式正确,但是用法无效
编译环节
运行
运行时候出错
运行过程
数据
数据值不合法
运行过程
宏相关
没有正确的使用宏
编译和运行过程
语法错误:
语法错误(Syntaxerrors)是指程序语句不符合SAS语言规范,可能是关键字错误、双引号不匹配,缺少分号等。
SAS在发现语法错误时候,首先它会试图使用一种“错误纠正”方法去纠正这个错误,如果能纠正,SAS会按照纠正后的程序执行,如果不能纠正,它就会报错,停止运行并在LOG窗口中显示。
注意:
SAS纠正后,在LOG窗口中会显示警告(WARNING),并将纠正后结果显示。
需要特别注意的,SAS纠正不一定是当初想要的结果,读者在运行SAS程序的时候一定要非常小心,即使程序能正常运行,一定要看LOG窗口中有无警告信息,有的话,要看警告信息内容进行相应的判断。
例子:
语法错误,SAS自动纠错
datea;
setsasuser.admit;
在SAS的LOG窗口可以看到
25datet;
----
14
WARNING14-169:
假定符号DATA错拼为date。
26setsasuser.admit;
27run;
NOTE:
从数据集SASUSER.ADMIT.读取了21个观测
NOTE:
数据集WORK.T有21个观测和9个变量。
例子:
语法错误,缺少分号,SAS报错
datat
setsasuser.admit;
run;
在SAS的LOG窗口可以看到
28datat
29setsasuser.admit;
---
56
ERROR56-185:
使用DATASTMTCHK=COREKEYWORDS选项时,在DATA语句中不允许使用SET。
请在DATA语句中查看是否缺失分号,或使用DATASTMTCHK=NONE。
30run;
NOTE:
由于出错,SAS系统停止处理该步。
词义错误:
词义错误是指程序语句中每个元素的格式是正确的,但用法无效。
词义错误包括变量名称拼写错误、数组引用错误、数据集引用错误等。
例如:
引用的逻辑库不存在
datatest;
setmylib.student;
run;
在SAS的LOG窗口可以看到
4datatest;
5setmylib.student;
ERROR:
没有分配逻辑库引用名MYLIB。
6run;
运行错误:
运行错误是指SAS在执行程序时候碰到数值错误,大部分运行错误SAS会在LOG窗口显示警告信息,但是允许程序继续执行,LOG窗口一般都会注解出行号和列号,以及相应的错误信息。
运行错误一般包括以下情况:
●函数的参数值无效;
●非法的数学运算(例如,0为除数);
●对于使用BY组分析处理时候,没有正确的排序;
●引用超出数组边界的元素;
●INPUT函数中数据类型不匹配;
●在打开文件和关闭文件时候出现错误;
●资源不足问题(例如磁盘空间不足,内存不足)
例如:
引用的逻辑库不存在
datatest;
inputItem$1-14TotalCost15-20
UnitsOnHand21-23;
UnitCost=TotalCost/UnitsOnHand;
datalines;
Hammers44055
Nyloncord350
Ceilingfans115530
;
run;
在SAS的LOG窗口
19datatest;
20inputItem$1-14TotalCost15-20
21UnitsOnHand21-23;
22UnitCost=TotalCost/UnitsOnHand;
23datalines;
NOTE:
检测到0为除数,位置:
行22列22。
RULE:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+-
25Nyloncord350
Item=NyloncordTotalCost=35UnitsOnHand=0UnitCost=._ERROR_=1_N_=2
NOTE:
在以下位置无法执行算术运算。
运算结果已设为缺失值。
每个位置的指定方式:
(次数)(行:
列)。
1,位置:
22:
22。
NOTE:
数据集WORK.DATA2有3个观测和4个变量。
27;
28run;
数据错误:
数据错误是指数据不适合当初定义的数据格式,就会出现数据报错。
例如定义了变量为数值型,但是实际使用字符型,这时候就会报错。
例子:
数据类型错误
dataage;
inputName$Number;
datalines;
小张35
小李xx
小王22
;
procprintdata=age;
run;
在SAS的LOG窗口输出
1dataage;
2inputName$Number;
3datalines;
NOTE:
在第5行、第8-9列中有对“Number”无效的数据。
RULE:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+-
5小李xx
Name=小李Number=._ERROR_=1_N_=2
NOTE:
数据集WORK.AGE有3个观测和2个变量。
NOTE:
“DATA语句”所用时间(总处理时间):
实际时间0.64秒
CPU时间0.01秒
7;
8
9procprintdata=age;
10run;
NOTE:
从数据集WORK.AGE.读取了3个观测
NOTE:
“PROCEDUREPRINT”所用时间(总处理时间):
SAS的print过程在output窗口输出的结果
TheSASSystem
ObsNameNumber
1小张35
2小李.
3小王22
可以看到无效的“XX”被置成了空值。
对于无效值如果想设置个默认值,可以使用INVALIDDATA选项。
一般在发生语法和词义错误时候,SAS系统LOG窗口会在它检查出错误的位置上加下划线,并标示数字。
通过SAS的LOG窗口,基本能够发现这些问题,但是对于数据中逻辑错误,则需要用到下一章的逻辑调试功能。
12.1.2DATA步中逻辑错误调试技巧
逻辑错误是指程序运行结果不是最初设计的结果,和语法错误错误不同,逻辑错误不会让程序停止运行,且不会在SAS的LOG窗口报错,相对于语法错误来说,逻辑错误更难发现,一般来说,可以用以下办法帮助调试逻辑错。
对于一个长的程序来说,将其中部分程序拷贝到新的程序窗口运行,观察运行结果。
在需要观测的地方使用PUT,可以LOG窗口检查观测的值
使用SAS的DATA步的调试工具DEBUG
本节主要讲调试工具DEBUG的使用技巧。
例子:
统计一个每个地区销售收入占比。
datasale;
inputzone$amount;
datalines;
北京2000
上海2000
山东1500
浙江1000
;
procunivariatedata=sale;
varamount;
outputout=preddatasum=sumamount;
run;
procprint;
run;
通过univariate过程步计算总的销售收入,可以得到总的销售收入为6500元。
datasaleprec;
setsale;
if_N_=1thensumamount=6500;
perc=amount/sumamount;
run;
procprint;
run;
可以看到output窗口输出
Obszoneamountsumamountperc
1北京200065000.30769
2上海2000..
3山东1500..
4浙江1000..
明显不是我们想要的结果,此时可以使用DEBUG过程进行逐步调试,发现其中问题。
DEBUG过程的调用方法:
在DATA步后面增加DEBUG选项。
datasaleprec/debug;
提交后将会出现两个窗口
上面的窗口是DEBUG的LOG窗口,在“>”可以输入DEBUG命令
下面的窗口是DEBUG的源,这里显示程序代码,显示方式和在LOG中显示一致。
可以看到光标停在加亮的那行,SAS程序此时暂停在这里。
在调试刚开始启动的时候,SAS首先完成DATA步程序的编译工作,停在加亮在DATA步后面第一行,准备后面循环运行。
如何查看变量值:
在进行程序逻辑调试时候,通常是通过查看运行中变量值,通过变量值结果和预期的逻辑结果之间比对,发现程序问题。
在SAS的DEBUG工具中,检查变量值方法是使用EXAMINE的方式。
利用在程序刚开始时候,看所有变量值,可以在DEBUG工具LOG窗口中使用。
EXAMINE_ALL_
回车后,在LOG窗口中显示如下:
可以看到,所有变量都列出,但是由于是第一步,DATA步还未sale数据集读入任何观测值。
在DEBUG工具LOG窗口使用STEP命令,或者使用菜单中“运行”下的“步进”子菜单。
和JAVA等编程语言的调试工具一下,SAS会运行下一步,在SOURC窗口光标已经移动一行,此时SAS从SALE数据集中读入第一行数据,再次运行EXAMINE_ALL_,在LOG窗口可以看到信息。
此时,ZONE值已经变为“北京”,amount值已经变为“2000”,而由于下面的程序行还未执行,sumamout和PERC的值还为空。
有时候程序中变量非常多,如果想要看特定变量的值,可以在EXAMINE后面写特定变量的名称,例如看amount的值,可以使用EXAMINEamount。
断点设置:
在调试过程中,可能希望程序执行到特定行,来观察运行的结果,这时候需要设置断点,当SAS程序执行到断点时候自动暂停。
SAS的DEBUG工具的断点设置非常简单,直接使用BREAK加上需要设置行数即可,例如上述程序在perc=amount/sumamount;这行设置断点,在SOUCRE窗口我们可以看到这是41行,那就可以使用BREAK41。
在LOG窗口中,显示断点已经设置,在SOURCE窗口中,第41行前面加了“!
”,表示这一行设置有断点。
如果要删除断点,可以使用DELETEBREAK命令。
断点可以同时设置多个。
设置断点后,使用GO命令即可运行到最近的断点,此时利用EXAMINE_ALL_可以看到SUMAMOUNT已经赋值。
下一循环到断点的时候,可以发现此时sumamount值为空,使用STEP命令运行下一行,可以发现PERC也为空。
这不是我们期望的结果,可以发现原来是sumamount没有赋值,需要使用RETAIN关键字,保持sumamount的值不变。
纠正后程序
datasaleprec;
setsale;
retainsumamount;
if_N_=1thensumamount=6500;
perc=amount/sumamount;
run;
procprint;
run;
在output窗口可以看到
Obszoneamountsumamountperc
1北京200065000.30769
2上海200065000.30769
3山东150065000.23077
4浙江100065000.15385
如果需要退出调试模式,使用QUIT命令即可。
欢迎您的下载,
资料仅供参考!
致力为企业和个人提供合同协议,策划案计划书,学习资料等等
打造全网一站式需求
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SAS 调试 技巧