SAS技术内幕:从程序员到数据科学家
个RUN 语句,但只有在遇到 QUIT 语句时 SAS 才释放系统资源返回当前SAS 会话。
●全局语句:在 DATA 步或PROC步之外,SAS还包括若干全局语句,通常用于指
定全局选项或者其他全局性的功能。比如 TITLE语句就可用来指定后续PROC 步
输出报告的标题文字,其中TITLE# (#为数字,如TITLE2)全局语句可用来指
定特定级别的标题,最多可达11级。如果希望在输出的图表中关闭特定级别的
报表标题,用户可以无参数调用TITLE 语句来实现。比如程序 1-2 可设置报表
输出的标题。
程序1-2 全局语句
title "The title of my first report"; /*设置输出报告的标题*/
title2 "Author:Yinliang Wu"; /*设置第二级的报告标题*/
title; /*关闭报告标题*/
各种SAS 选项语句也属于全局语句,功能上类似于操作系统的环境变量,不过它
用来指定当前SAS 会话有关的系统设置,如程序1-3 用于设置当前会话(Session)的
语言区域属性(Locale)为英文,此时后续的过程步都会受此选项影响输出英文语言
的报告。
程序1-3 全局语句
options locale=en_US;/*设置会话的语言区域属性*/
●DATA 步:数据步负责为后续数据步或过程步准备待分析的数据,它是SAS语言
核心的组成部分之一。其基本语法为
data mydata;
<语句和数据>;
run;
比如程序1-4 创建一行具有5 列的数据表,其中Name 和Sex 是字符型变量,其他
3 个为数值型变量。它与系统数据集sashelp.class 的表结构类似。
程序1-4 DATA步范例
data mydata;
input Name $ Sex $ Age Height Weight;
datalines;
LEON M 30 175 83.5
run;
●PROC步:SAS过程步是执行特定任务的一系列SAS语句的集合,它以 PROC 语
句开始,一般到下一个 RUN语句结束;如前所述,某些PROC 如PROC SQL 允许
有多条RUN语句提交代码到DBMS内执行,但只有当该PROC最后一个QUIT语
句运行后才会释放资源返回SAS会话环境。每个过程步都有自己特定的SAS 语
句,也有很多过程步共享相同的SAS 语句和参数选项,如几乎所有的过程步都
有data= 参数用来指定待处理的输入数据集名称(见程序1-5)。
程序1-5 PROC步范例
proc contents data=mydata;
run;
proc print data=mydata;
var name height;
run;
参数data=mydata是proc contents和proc print两个过程步语句都有的选项,用来指
定过程步的输入数据集。如果过程步没有指定data=参数,则系统默认使用当前SAS
会话中最后使用或生成的那个数据集,该数据集的名称也存在于当前会话的系统宏变
量&SYSLAST。
●
程序注释:代码注释通常用于标注不可执行的文本,如描述程序的功能,或出于生
成文档的目的在代码中添加说明性文本。注释还可用来在调试代码过程中将已经
调试好的SAS代码暂时隔离,当代码运行时注释中的代码会被编译器自动忽略,但
SAS注释依然会被写入SAS日志文件。 鉴于SAS宏本质是文本替换,需要特别注意的
一点是在MACRO宏代码中应尽量使用块注释,谨慎使用行注释以免导致不期望的宏
展开,宏代码中使用行注释应中以 %* 开始,分号结束。SAS块注释和行注释如下。
(1)块注释:SAS 语言支持C/C++和 Java 等语言广泛使用的块注释,它以 /*开
始,以后续最近的*/号结束,注释可以包含分号以及任何长度的文本,也可以跨行(见
程序 1-6)。但SAS代码不支持嵌套使用块注释。
程序1-6 块注释
/*
* 块注释1…
*/
proc contents data=mydata;
run;
(2)行注释:行注释以星号“*”开始,结束于最近的一个分号“;”处。虽然它可
注释多行文本,但它总是以最近的一个分号(包括引号中的分号)结束;其设计初衷用
于调试过程中注释掉单行语句,跨多行的文本建议使用块注释以免产生意想不到的结果。
(见程序 1-7)。
程序1-7 行注释
* 行注释1…;
proc contents data=mydata; * 行注释2…;
* 行注释3…;
run;
虽然SAS代码在格式上具有很强的灵活性,但良好的代码风格能提高代码的可读性
和可维护性。因此,一般情况下请遵循如下SAS代码格式化规范,使SAS代码具有较
强的可读性。
(1)全局语句、DATA / PROC步语句、步结束语句RUN / QUIT 等语句应开始于
第一列,而其他子语句通常采用逐级缩进,以显示层次结构关系。
SAS技术内幕:从程序员到数据科学家
(2)SAS 步与步之间通常用空行分隔,以表示SAS 代码的编译边界,方便代码错
误调试。
(3)当单行代码因参数较多导致长度较大时,应折行处理,并在该语句的结束分
号后加上一个空行。
总的来说,SAS 的DATA 步和PROC 步是SAS 语言对数据分析工作的精妙抽象和
完美封装,数据步主要解决待分析的数据结构和数据准备问题,而过程步解决特定分析
方法和流程的实现和封装;这两种SAS 步就像数据结构和算法设计,大体上分别负责数
据结构和算法逻辑实现。只有当需要更加复杂的自定义数据处理和分析算法时,才需要
后面章节中将会讲到的各种函数封装进行扩展。
1.2 编程环境
SAS 编程需要使用什么样的开发环境?其实它跟其他计算机语言一样,可用任何纯
文本编辑器编写SAS 代码,如 Windows 平台的记事本,NotePad+ + 或者UltraEditor 工具。
也可以使用UNIX 上的vi 来编辑代码,不过需要注意的是Windows 平台使用回车换行符
CRLF 而Unix 平台使用换行符LF 进行文本换行。用文本编辑器生成的SAS 代码文件,其
文件编码(File Encoding )需要与SAS 运行时的会话编码(Session Encoding )匹配,否则可
能出现不期望的乱码或程序行为。这并不是SAS 语言编程特定的文件处理问题,而是所有
编程语言都会面临的源代码文件编码和编译器读取文件的所采用的编码之间的匹配问题。
在SAS 执行环境中检查当前SAS 会话编码,可使用PROC OPTIONS 过程步检查(见
程序 1-8),它会输出当前SAS 系统使用的默认语言区域设置以及字符集编码信息。
程序1-8 检查当前SAS会话的Locale/Encoding 设置
proc options option=(locale encoding);
run;
对于用户用文本编辑器编写好的SAS 代码,如何用命令行方式编译运行SAS 代码?
对于已经安装好SAS 环境的机器,用户只需要调用sas.exe 然后指定-sysin 命令行参数
将SAS 代码文件的全路径传递给SAS 即可。默认SAS 代码运行后生成的日志文件会输
出到当前路径,用户也可以使用命令行参数-log 进行指定。比如:
C:\>"C:\Program Files\SASHome\SASFoundation\9.4\sas.exe"
-sysin C:\temp\helloworld.sas -log C:\temp\helloworld.log
SAS 默认使用配置文件为C:\Program Files\SASHome\SASFoundation\9.4\sasv9.cfg,
也就是当前机器上安装SAS 时生成的默认配置。检查该文件的内容可发现它默认指向
了SAS 安装目录下面的某个语言特定的配置文件。比如在中文环境上安装的SAS,该
sasv9.cfg 文件的内容如下,表示默认使用中文配置来建立SAS 会话环境并运行SAS 代码。
-config "C:\Program Files\SASHome\SASFoundation\9.4\nls\zh\sasv9.cfg"
如果用户想在中文的环境上运行特定配置的SAS,如希望用纯英文版SAS执行用
户代码,用户只需要在运行SAS代码时直接指定特定配置文件即可。检查该环境运行的
SAS日志文件将会发现所有的输出内容变成了英文文本。
C:\>"C:\Program Files\SASHome\SASFoundation\9.4\sas.exe"
-config "C:\Program Files\SASHome\SASFoundation\9.4\nls\en\sasv9.cfg"
-sysin C:\temp\helloworld.sas -log C:\temp\helloworld.log
同理,如果想用英文版SAS执行代码但程序中又要支持处理中文数据,用户则可以
使用SAS安装目录中的 nls\1d\sasv9.cfg 配置文件;如果想用Unicode版本的SAS来运
行代码,则需要使用 nls\u8\sasv9.cfg 配置文件。
展开