SAS中的编程技巧:
1.Data步中加上LIST; /*显示每行的数据,以便核对。可省之*/
2.infile fileref PAD; /*PAD选项会在每条记录填补空格,使它们具有同样的长度*/
3.获取系统的日期、时间
利用date()/today()、time()等函数获取系统日期和时间。
例如:dt=date(); te=time();
利用sysdate、systime系统宏变量获取SAS启动时的日期时间。
例如:dd="&sysdate"d; tt="&systime"t;
补充说明:
yrdif(stardate,enddate,'actual') 返回两个日期之间的真实间隔年数
datdif(stardate,enddate,'actual') 返回两个日期之间的真实间隔天数, 与intck函数的效果是一样的
INTCK("day",d1,d2); /* 计算d1、d2日期之间的天数intd */
day() 返回日
month() 返回月
qrt() 返回季
year() 返回年
weekday() 返回星期, 值为一个1~7的数值,其中Sunday是1,而Saturday是7
intck() 返回计算两个日期之间的天数
intnx('interval',d1,d2) 返回d1之后d2个间隔后的日期
例如:
data tmp; /* 建立数据集tmp*/
informat d1 d2 YYMMDD10.;/* 设置变量d1、d2的日期输入格式*/
input d1 d2; /* 读入变量d1、d2的值*/
intd=intck("day",d1,d2); /* 计算d1、d2日期之间的天数intd */
d3=intnx("week",d1,10); /* 计算d1日期后10个星期时的日期d3 */
format d1-d3 YYMMDD8.; /* 设置变量d1、d2、d3的日期输出格式*/
cards;
2001/06/30 2002/06/30 结果:
2001:08:01 2001-10-01 OBS D1 D2 INTD D3
proc print; 1 01-06-30 02-06-30 365 01-09-02
run; 2 01-08-01 01-10-01 61 01-10-07
4.scan只能用于char类型的搜索。而index, indexc不受此局限。
5.像c语言一样,数组下标从0开始其实是有好处的,可以提高处理的速度。
6.如何将指针向左移动?
解答:可以采用+负数的形式,但是不要自作聪明的就写一个负数。
例如:
正确的写法 input @23 length 4. +(-5) width 4.;
错误的写法 input @23 length 4. -5 width 4.;
7.options ls=80 ps=60 replace;
ls(line size)是行数
ps(page size)是列数
replace是允许替换永久数据库
8._N_代表SAS执行DATA步的次数,一般来说,是等于读入观测的条数的
1.Data步中加上LIST; /*显示每行的数据,以便核对。可省之*/
2.infile fileref PAD; /*PAD选项会在每条记录填补空格,使它们具有同样的长度*/
3.获取系统的日期、时间
利用date()/today()、time()等函数获取系统日期和时间。
例如:dt=date(); te=time();
利用sysdate、systime系统宏变量获取SAS启动时的日期时间。
例如:dd="&sysdate"d; tt="&systime"t;
补充说明:
yrdif(stardate,enddate,'actual') 返回两个日期之间的真实间隔年数
datdif(stardate,enddate,'actual') 返回两个日期之间的真实间隔天数, 与intck函数的效果是一样的
INTCK("day",d1,d2); /* 计算d1、d2日期之间的天数intd */
day() 返回日
month() 返回月
qrt() 返回季
year() 返回年
weekday() 返回星期, 值为一个1~7的数值,其中Sunday是1,而Saturday是7
intck() 返回计算两个日期之间的天数
intnx('interval',d1,d2) 返回d1之后d2个间隔后的日期
例如:
data tmp; /* 建立数据集tmp*/
informat d1 d2 YYMMDD10.;/* 设置变量d1、d2的日期输入格式*/
input d1 d2; /* 读入变量d1、d2的值*/
intd=intck("day",d1,d2); /* 计算d1、d2日期之间的天数intd */
d3=intnx("week",d1,10); /* 计算d1日期后10个星期时的日期d3 */
format d1-d3 YYMMDD8.; /* 设置变量d1、d2、d3的日期输出格式*/
cards;
2001/06/30 2002/06/30 结果:
2001:08:01 2001-10-01 OBS D1 D2 INTD D3
proc print; 1 01-06-30 02-06-30 365 01-09-02
run; 2 01-08-01 01-10-01 61 01-10-07
4.scan只能用于char类型的搜索。而index, indexc不受此局限。
5.像c语言一样,数组下标从0开始其实是有好处的,可以提高处理的速度。
6.如何将指针向左移动?
解答:可以采用+负数的形式,但是不要自作聪明的就写一个负数。
例如:
正确的写法 input @23 length 4. +(-5) width 4.;
错误的写法 input @23 length 4. -5 width 4.;
7.options ls=80 ps=60 replace;
ls(line size)是行数
ps(page size)是列数
replace是允许替换永久数据库
8._N_代表SAS执行DATA步的次数,一般来说,是等于读入观测的条数的