前言

目前项目进行到中期,最近又学习了一些新的知识,例如sas拼表、导出文件、数据集筛选等,好记性不如烂笔头,记录下来有待后期回头查看,人生总是走在学习的道路上。

SAS 导出文件

SAS将数据集导出为文件有两种方法,一种使用PROC EXPORT,另外一种是使用DATA

  • proc export
1
2
3
4
5
6
7
8
9
10
11
12
PROC EXPORT DATA=DATA_SET OUTFILE="/sas/data_set.txt" DBMS=TAB REPLACE;
DELIMITER="|";
PUTNAMES=NO;
RUN;
/*
DATA:指定要导出的数据集
OUTFILE:指定要导出的文件
DBMS:指定导出文件类型,文本文件为TAB CSV文件为CSV
REPLACE:文件覆盖选项
DELIMITER:指定文件的分隔符
PUTNAMES:指定是否输出表头
*/
  • data
1
2
3
4
5
6
7
8
9
10
11
12
13
FILENAME DATA_SET "/sas/data_set.txt";
DATA _NULL_;
SET DATA_SET;
FILE DATA_SET LRECL=32767 DLM="|" ENCODING="UTF-8" TERMSTR=CRLF;
PUT
NAME AGE CLASS_NAME;
RUN;
/*
LRECL:指定读入记录的长度,默认是256
DLM:指定分割符
ENCODING:指定文件编码
TERMSTR:指定记录分隔符
*/

SAS 数据集筛选

  • WHERE子句进行筛选

SAS 数据集筛选可以在DATA步中进行操作,使用WHERE关键字对指定的列的值进行条件筛选,例子如下:

1
2
3
4
DATA STUDENT;
SET STUDENT;
WHERE AGE <= 10;
RUN;
  • KEEP关键字

KEEP关键字可以使数据集保留下你想要的字段,比如一个表里边有五个字段,你只想保留三个字段,则使用KEEP关键字进行过滤

1
2
3
4
DATA STUDENT;
SET STUDENT;
KEEP 字段1 字段2 字段3;
RUN;
  • DROP关键字

DROP关键字可以丢掉你不想要的字段

1
2
3
4
DATA STUDENT;
SET STUDENT;
DROP 字段1 字段2 字段3;
RUN;
  • 另外的写法
1
2
3
4
5
6
7
8
9
10
11
DATA STUDENT;
SET STUDENT(KEEP=);
RUN;

DATA STUDENT;
SET SUTDENT(DROP=);
RUN;

DATA STUDENT;
SET STUDENT(WHERE=);
RUN;

SAS 循环语句格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DATA _NULL_;
IF CONDITION THEN ACTION;
RUN;

DATA _NULL_;
IF CONDITION THEN DO;
ACTION;
ACTION;
ACTION;
END;
RUN;

DATA _NULL_;
IF CONDITION THEN ACTION;
ELSE IF CONDITION THEN ACTION;
ELSE IF CONDITION THEN ACTION;
ELSE IF CONDITION THEN ACTION;
ELSE CONDITION THEN ACTION;
RUN;

SAS 拼表

SAS 拼表过程十分简单,拼表意思就是表A和表B有共同的列,将表根据相同的列拼在一起,跟SQL中的left join和right join还有inner join是一个道理,在拼表之前需要将数据集根据公共的字段排序,需要用到PROC SORT,下面介绍一下PROC SORT

  • PROC SORT
1
2
3
4
5
6
7
8
9
10
PROC SORT DATA=STUDENT NODUPKEY DUPOUT=;
BY 字段名1 字段名2 字段名3;
/*PROC SORT 默认会根据第一个字段排序,然后第二个,第三个*/
RUN;

/*
NODUPKEY:关键字可以实现去重功能
DUPOUT=数据集名称:可以实现将重复的数据放在指定的数据集中
BY DESCENDING:默认以升序排序,用了DESCENDING关键字则以降序排序
*/
  • MERGE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*left join*/
DATA STUDENT;
MERGE A(IN=A) B(IN=B);
BY NAME;
IF A;
RUN;
/*right join*/
DATA STUDENT;
MERGE A(IN=A) B(IN=B);
BY NAME;
IF B;
RUN;
/*inner join*/
DATA STUDENT;
MERGE A(IN=A) B(IN=B);
BY NAME;
IF A AND B;
RUN;

/*
MERGE:表A(IN=A) 表B(IN=B)
BY 后面跟两个表共有的主键
IF 后面跟表关联关系
*/