level 12
际遇海洋
楼主
SAS的语法其实很简单,SAS是一种面向过程的语言,其有两个主要部分构成:Statements 和 Options。
1. Statement
Statements就是SAS中的语句,是SAS程序的主干,主要告诉SAS需要进行哪些操作,用分号 ';' 结尾。而Statements由SAS关键字,SAS名称,特殊符号和运算符构成。
例如 DATA a; 就是一个DATA Statement。DATA就是一个sas关键字,a就是一个sas名称。又比如 length x $10.; 就是一个length Statement,x是一个sas名称,'$'和'.'是特殊符号。
函数是SAS Statement的一种特殊组成部分,能接收输入,并返回输出。函数名称后面跟着小括号,小括号里面的参数用逗号分隔开。例如 x = substr(y,1,10);这个Statement由名称x,赋值运算符= 和substr函数组成,其中y,1和10都是函数的参数。
2. Options
Options就是SAS中的选项,用来修饰Statements,主要告诉SAS怎样进行这些操作。options根据修饰的对象不同,其语法不相同,但多个option存在时,之间都用空格分隔。
1. 当options修饰SAS数据集时,用小括号把options框起来。
2.当options修饰SAS关键字的时候,则只用空格将options与主干分隔。
3. 在Proc步骤中,除了Proc statement以外,其他修饰statement的options则需要用反斜杠'/'与主干分隔开。
例如:
Data a(where = (x = 2));这个语句由主干 Data a和选项where = (x = 2)组成。其中where = (x = 2)修饰SAS名称:数据集名a,所以用括号括起来。
Infile x dlm=',' dsd missover;这个语句主干是Infile x ,dlm=‘,’ dsd 和missover都是修饰infile的选项。因此满足情况2.
model y = x1 x2 x3/ stb vif; 是从属于Proc Statement的model statement,stb和vif都是修饰这个model的options,与主干用'/'分隔开,但内部用空格分隔。
注意:单独的where x = 2;是where statements,不是options。options一定是要有修饰对象的。
附:一些特殊符号
1. 点号'.'。
SAS中的点号。主要会出现在三个地方:逻辑库.数据集、SAS Format和宏变量中,主要起到分隔的作用。例如$10. 表示的是$10这样一个Format名称。
又如%let a = mylib; data &a..mydataset; 第一个.代表分隔宏变量&a 和后面的.mydataset,而第二个.则是逻辑库.数据集里面的分隔符。data &&a&i...mydataset; 这里三个点的前两点分别表示表示分隔宏变量&&a&i 和 &ai。
2. 逗号','。
逗号用来分隔参数。比如函数的参数和宏的参数。此外,在SQL中,由于SQL语言本身的特性,逗号也用来分隔变量。比如select *, x1 as var1, x2 as var2 from mylib.mydataset; 就是一个select Statement。其中变量名用逗号分隔。
3. Trail 符号 ‘@’。
SAS 中的@是指针控制符。用来规定指针的位置,@numerical expression的话,就是把指针移动到该expression所指向的位置。如果@在input语句末尾,则代表将指针停留在数据行的末尾直到执行下一个input语句。如果是@@在input语句末尾,则代表将指针停留在数据行的末尾直到执行下一个data步。
3. 井号 ‘#’。
换行符号,制定指针读取的行数。
4. 引号。
分为单引号和双引号,其中单引号内部的宏不解析,双引号内部的宏要解析。此外,单引号用在在call symput和call symget语句中定义宏变量。
5. 百分号%。
用来定义宏语句,%开头的语句有优先编译权。
例如
%let x = 2;
data a;
%if &x = 2 %then %do;
var1 = 1;
%end;
run;
先编译%开头的语句得到
data a;
var1 = 1;
run;
然后在编译这段程序。
6. Ambersand 号‘&’。
用来引用宏变量,可以嵌套。
7. 分号 ';'。
用来分隔Statements, 每一个statement有且只有一个;。
8. 冒号 ':'。
这个出现的地方就比较多了。常见在input语句里面,用来修饰Format,比如$10. 会定义一个长度为10的字符串,如果文件中的字符串长度不到10,那就把分隔符也当做字符串的一部分往后读,直到读完10个长度。:$10.则避免了这个问题。有时候在SQL里面也会看到,select into语句中,用在定义的宏变量名称前。
2018年04月16日 15点04分
1
1. Statement
Statements就是SAS中的语句,是SAS程序的主干,主要告诉SAS需要进行哪些操作,用分号 ';' 结尾。而Statements由SAS关键字,SAS名称,特殊符号和运算符构成。
例如 DATA a; 就是一个DATA Statement。DATA就是一个sas关键字,a就是一个sas名称。又比如 length x $10.; 就是一个length Statement,x是一个sas名称,'$'和'.'是特殊符号。
函数是SAS Statement的一种特殊组成部分,能接收输入,并返回输出。函数名称后面跟着小括号,小括号里面的参数用逗号分隔开。例如 x = substr(y,1,10);这个Statement由名称x,赋值运算符= 和substr函数组成,其中y,1和10都是函数的参数。
2. Options
Options就是SAS中的选项,用来修饰Statements,主要告诉SAS怎样进行这些操作。options根据修饰的对象不同,其语法不相同,但多个option存在时,之间都用空格分隔。
1. 当options修饰SAS数据集时,用小括号把options框起来。
2.当options修饰SAS关键字的时候,则只用空格将options与主干分隔。
3. 在Proc步骤中,除了Proc statement以外,其他修饰statement的options则需要用反斜杠'/'与主干分隔开。
例如:
Data a(where = (x = 2));这个语句由主干 Data a和选项where = (x = 2)组成。其中where = (x = 2)修饰SAS名称:数据集名a,所以用括号括起来。
Infile x dlm=',' dsd missover;这个语句主干是Infile x ,dlm=‘,’ dsd 和missover都是修饰infile的选项。因此满足情况2.
model y = x1 x2 x3/ stb vif; 是从属于Proc Statement的model statement,stb和vif都是修饰这个model的options,与主干用'/'分隔开,但内部用空格分隔。
注意:单独的where x = 2;是where statements,不是options。options一定是要有修饰对象的。
附:一些特殊符号
1. 点号'.'。
SAS中的点号。主要会出现在三个地方:逻辑库.数据集、SAS Format和宏变量中,主要起到分隔的作用。例如$10. 表示的是$10这样一个Format名称。
又如%let a = mylib; data &a..mydataset; 第一个.代表分隔宏变量&a 和后面的.mydataset,而第二个.则是逻辑库.数据集里面的分隔符。data &&a&i...mydataset; 这里三个点的前两点分别表示表示分隔宏变量&&a&i 和 &ai。
2. 逗号','。
逗号用来分隔参数。比如函数的参数和宏的参数。此外,在SQL中,由于SQL语言本身的特性,逗号也用来分隔变量。比如select *, x1 as var1, x2 as var2 from mylib.mydataset; 就是一个select Statement。其中变量名用逗号分隔。
3. Trail 符号 ‘@’。
SAS 中的@是指针控制符。用来规定指针的位置,@numerical expression的话,就是把指针移动到该expression所指向的位置。如果@在input语句末尾,则代表将指针停留在数据行的末尾直到执行下一个input语句。如果是@@在input语句末尾,则代表将指针停留在数据行的末尾直到执行下一个data步。
3. 井号 ‘#’。
换行符号,制定指针读取的行数。
4. 引号。
分为单引号和双引号,其中单引号内部的宏不解析,双引号内部的宏要解析。此外,单引号用在在call symput和call symget语句中定义宏变量。
5. 百分号%。
用来定义宏语句,%开头的语句有优先编译权。
例如
%let x = 2;
data a;
%if &x = 2 %then %do;
var1 = 1;
%end;
run;
先编译%开头的语句得到
data a;
var1 = 1;
run;
然后在编译这段程序。
6. Ambersand 号‘&’。
用来引用宏变量,可以嵌套。
7. 分号 ';'。
用来分隔Statements, 每一个statement有且只有一个;。
8. 冒号 ':'。
这个出现的地方就比较多了。常见在input语句里面,用来修饰Format,比如$10. 会定义一个长度为10的字符串,如果文件中的字符串长度不到10,那就把分隔符也当做字符串的一部分往后读,直到读完10个长度。:$10.则避免了这个问题。有时候在SQL里面也会看到,select into语句中,用在定义的宏变量名称前。