• SAS | 格式规范数据读取


     

    1 导入数据的方法

    将数据导入SAS的方法有很多,但可以归纳为四个基本类别,其中方法2、3是需要掌握的重点。

    1. 直接将数据输入SAS数据集
      • 通过VIEWTABLE窗口(打开方式:工具 → 表编辑器),以表格形式导入
      • 通过SAS Enterprise Guide窗,以表格形式导入
    2. 利用原始数据文件创建SAS数据集
      • 通过data步导入
      • 通过导入向导 或 有类似功能的import过程导入
    3. 将其他软件的数据文件转换成SAS数据集
      • 通过data步或import过程,把其他类型的数据文件读成SAS数据集
    4. 直接读取其他软件的数据文件

     

    2 利用导入向导读入

    导入向导默认数据第一行作为变量名称,并会自动扫描文件来决定变量的类型。使用导入向导导数一般分以下几个步骤:

    • 启动:文件 → 导入数据
    • 选择导入文件类型
    • 选择导入文件
    • 选定分隔符:左击options选择,csv和制表符(Tab)分隔文件SAS会自动识别
    • 指定逻辑库和数据集名称
    • fish结束

     

    3 格式规范数据读取

    3.1 指定原始数据位置(infile)

    根据原始数据存储的不同位置,可以分为内部原始数据、外部原始数据。用infile语句来指定元数数据位置。

    内部原始数据

    如果在SAS程序中输入数据,则这些数据被称为内部原始数据,使用「datalines语句」表明它。需注意的是,datalines语句必须是data步最后一条语句,其后的所有行都将被视为数据行,直到遇到一个分号(;)为止。

    *将内部原始数据读入到SAS数据集;
    data work.testdata;
    	input president $ party $ number;    /* 输入指定类型的3个变量 */
    	datalines;                           /* 数据线 */
    Adams F 2
    Lincoln R 16
    Grant R 18
    kennedy D 35
    ;
    run;
    

     
    外部原始数据

    更常见数据是保存在外部文件中,这时数据与程序是分离的,就称为外部原始数据。需要用「infile语句」告知SAS文件名和路径,infile语句紧跟在data语句之后,input语句之前,且不同操作环境中路径表示有差异:

    操作环境 infile语句
    windows infile 'D:code est.dat';
    unix infile '/home/rds/test.dat';
    os infile 'mydir.test.dat';

     
    长记录

    当从外部数据文件读入数据时,务必记得「检查日志」,因为一些非常有价值的信息,会在日志中体现,如观测数、变量数、记录最大/最小长度。

    若外部文件中记录长度超过了256个字符,且SAS没有读取到所有数据,这时可以在infile语句中使用lrecl=选项,指定一个至少和数据文件中最长记录等长的长度。

    *从外部原始数据读入数据到SAS数据集;
    data work.testdata;
    	infile infile 'D:code	est.dat' lrecl = 300;   /* 指定记录长度最大为300个字符 */
    	input president $ party $ number;
    run;
    

     

    3.2 读取空格分隔原始数据(列表输入)

    如果原始数据文件中的所有值,都被至少一个空格分隔开,建议使用列表输入(list input)读入该原始数据,该方法也被称为自由格式输入。

    下面是列表输入的优缺点:

    • 优点:简单好用
    • 缺点:
      • 只能读取一条记录中全部数据,不能跳过不需要的值
      • 如果有字符型数据,那它必须没有内嵌空格,且长度不超过8个字符
      • 如果数据文件含日期、其他特殊格式数据,那列表输入不适用

    特别注意,列表输入也可用于读取其他分隔符数据文件,如逗号或制表符。并且,可以使用length语句去覆盖长度不超过8个字符的限制,使字符变量长度变成1 ~ 32767之间任意值。

     
    INPUT语句

    列表输入是通过input语句实现数据读入,语法规则如下:

    • 在input关键字后,按照变量名称出现顺序依次列出它们
    • 变量名称符合命名规则
    • 若变量为字符类型,则在变量名称后面加一个$
    • 变量名称之间至少留一个空格

    示例:input toadname $ weight jump1 jump2 jump3;

    *使用列表输入,读取数据文件ToadJump.dat;
    data toads;
    	infile 'D:codeToadJump.dat';
    	input toadname $ weight jump1 jump2 jump3;
    run;
    
    proc print data = toads;
    	title '蟾蜍跳跃比赛';
    run;
    

     

    3.3 读取按列排列原始数据(列输入)

    列输入和列表输入类似,但适用范围更广,具有以下几点优势:

    • 值之间无须空格
    • 缺失值可以留空
    • 字符型数据可以内嵌空格
    • 可以跳过不需要的变量

    通常调查数据、带有街道地址的数据集,可采用列输入读取。

     
    INPUT语句

    列输入也是通过input语句实现数据读入,语法规则和列表输入类似,区别在于变量之后需要列出该变量对应的列或者列范围,用这些列表示数值或者字符在数据行中的位置。

    示例:input Name ¥ 1-10 Age 11-13 Height 14-18;

     

    3.4 读取非标准格式的原始数据(格式化输入)

    先明确一个概念「标准格式数据」,只包含数字、小数点、正负符号、科学计数法E。其他的都是非标准格式数据,常见的有:

    • 日期

    • 嵌入逗号的数字

    • 嵌入$符号的数值

     
    输入格式

    输入格式的三个基本类型是:字符、数值、日期

    字符 数值 日期
    $informatw. informatw.d informatw.

    $表明这是字符型输入格式,imformat是该输入格式的名称,w是总宽度,d是小数位数(仅限数值型输入格式),注意,一定不要少些了句点(.)。有两个输入格式没有名称:​

    • $w. 用来读取标准的字符型数据
    • w.d 用来读取标准的数值型数据

     
    格式化输入

    在input语句的变量名称之后放置输入格式,称为格式化输入。

    示例:input name $10. age 3. height 5.1 birthdate mmddyy10. ;

    先明确一个概念:为每个变量读取的列,由起始点和输入格式的宽度所决定。所以,上面的示例代码就能解读为:

    • name($10.):字符型数据,默认起始列在第1列,name数据在第1 ~ 10列
    • age(3.):数值型数据,起始列在第11列,往后取3列
    • height(5.1):数值型数据,起始列在第14列,往后取5列,小数位数为1
    • birthdate(mmddyy10.):日期数据,格式为月-日-年,能读取诸如10-31-2013或10/31/2013格式的日期,起始列在第19列,往后取10列
    *读取非标准格式的原始数据;
    data zdata.contest;
    	infile 'D:datasas_filepumpkin.dat';
    	input name $16. age 3. +1 type $1. +1 date mmddyy10.  /* +1表示跳过一列 */
    		  (score1 score2 score3 score4 score5) (4.1);    
    run;
    

    有相同输入格式,把变量和输入格式分别放到括号中,输入格式只列出一次 即可。

    更多常见的常见输入格式见page49,第二章 2.8 常用输入格式。

     

    3.5 混合的输入样式(列表输入+列输入+格式化输入)

    前面学习了三种主要的输入样式:

    • 列表输入:最简单
    • 列输入:稍微难一点
    • 格式化输入:最复杂

    因为SAS中数据格式多种多样,没有一种输入样式能满足绝大多数需求。所,更多时候我们采用混合的样式输入。

    示例:input parkname $ 1-22 state $ year @40 acreage comma9. ;

    上面的示例就采用了多种样式的组合:

    • parkname ($ 1-22):列输入
    • state($):列表输入
    • year:列表输入
    • acreage (comma9):格式化输入

    此外,还用了列指针,语法@n,n指SAS要移动到的列,常用来在一行数据里向前或者向后移动,以调整数据读取起始位置,应用场景有:

    • 跳过不需要的数据
    • 使用不同的输入格式两次读取同一个变量
  • 相关阅读:
    Redis 设计与实现(第三章) -- 链表adlist
    Redis 设计与实现(第二章) -- SDS
    MySQL索引背后的数据结构及算法原理(转)
    MySQL索引原理及慢查询优化(转)
    MySQL常见的一些面试题(未完待续)
    js 获取前天、昨天、今天、明天、后天的时间
    linux 下nohup 使用
    java split 分割字符串用法
    Python 获取URL访问的HEAD头信息
    MySQL日期数据类型、时间类型使用总结
  • 原文地址:https://www.cnblogs.com/1k-yang/p/12133258.html
Copyright © 2020-2023  润新知