今天详细说说指针。
相对于其他的编程语言而言,SAS在读取数据时也是通过SAS的指针控制符来控制读取数据的。指针控制符分为行指针和列指针,下面我们结合例子来说这两种指针。
1)列指针控制符
语法格式:@n
此处的@是列指针标志符号,n是整数类型,指明列的开始位置。
%let lj='d:\test\xy.txt'; /*外部文件路径*/
filename xy "(&lj)"; /*为路径命名*/
DATA area;
infile xy; /*读文件*/
input @1 bh $3. /*列指针控制读取*/
@4 prov $17.
@21 zone $4.
;
RUN;
PROC print;
RUN;
结果输出:
Obs bh prov zone
1 001 北京市西城区 1000
2 002 山东青岛 0532
3 003 新疆石河子 0023
4 004 江苏省南京市 3562
5 005 广东省广州市 9876
6 006 陕西省西安市 6789
程序解读:
对外部文件进行分析,INPUT语句定义读取位置和变量,
@1表示变量bh从第一列开始读取数据,
$3.指明变量bh为字符类型,长度为3,读取3个字符就结束。
其他变量的定义形式与bh变量类似。
语法格式: n1-n2
n1表示列开始的位置,正整数值。
n2表示列结束的位置,正整数值。
%let lj='d:\test\xy.txt'; /*外部文件路径*/
Filename lxy "(&lj)"; /*为路径命名*/
DATA lxy;
infile lxy; /*读文件*/
input bh $ 1-3 /*列控制符号读取*/
prov $ 4-20
zone $21-24
;
RUN;
显示结果和 1)的输出显示结果是一样的。
程序解读:
INPUT语句中定义变量bh的数据类型为字符类型,
1-3指明此变量对应的数据从数据文件中的第一列开始,
到第三列结束。其他变量分析方式和定义变量bh类似。
@:INPUT语句中单个“@”行控制符号,可以让指针控制在当前行,当遇到下个INPUT时行指针才移动。
提示:对于数据块和数据文件进行过滤的时候,会经常用到。
%let xy= 'd:\test\xyk.txt';
filename xyk "(&xy)";
LIBNAME xy 'd:\test';
DATA xy.atype;
file xyk;
input @20 type $1.
@; /*行控制符号*/
if type='A' then do; /*取type='A'类型的卡的条件*/
input @1 bh $3.
@4 cardn $16.
;
output xy.atype;
end;
RUN;
PROC print noobs; /*打印输出窗口不显示标号*/
RUN;
显示输出结果:
type bh cardn
A 001 1234567891234567
A 002 4567893456654328
A 003 7896543214356789
程序解读:
语句input @20 type $1. @;
先读取type变量的数据,然后通过if type='A'语句判断,
符合条件的就执行DO END语句块中input语句中定义的变量。
INPUT语句中在读取数据文件或数据块总的数据时多条观测记录写在一行时,为控制列中每个列对应数据到相应的列,行控制符“@@”起到按记录条数分隔数据的作用,并按对应列读取数据。
DATA mobile_inf;
input sjh wfcs @@; /*@@控制符号 读取多条记录在一行的记录*/
label sjh='手机号' wfcs='违法次数';
CARDS;
13766543213 3 12345678909 2 15432123678 6
13799876543 2 98876543218 9
;
RUN;
PROC print label; /*加label显示标签信息到输出窗口*/
RUN;
显示输出结果:
Obs 手机号 违法次数
1 13766543213 3
2 12345678909 2
3 15432123678 6
4 13799876543 2
5 98876543218 9
程序解读:cards语句中的数据没有按列对齐书写,
因此通过@@控制按input语句指定的变量对应读取。
来源:oschina
链接:https://my.oschina.net/u/1866370/blog/551111