接上一篇文章,接下来开始介绍从文件中读取数据
从文件中读取数据
虽然说从文件中读取数据的本质上都是INFILE
语句的使用,但是作为小白玩家,掌握从文件窗口直接导入数据还是很有必要的。
接下来就开始吧。
从窗口导入文件
本标题所指窗口,意为sas软件的窗口,如下红色箭头所指
LOG窗口出现如下字样时提示文件导入成功
以上便是导入的数据
变量读取时出现了一个小错误,目前我还不太清楚是为什么,希望走过路过的大佬能指点一下
另外,在导入时需要确定你的sas版本所支持的数据格式,如笔者使用的sas版本为9.1.3,如图可见其支持以上格式的数据,
选中格式进行文件导入后,一般会进行两步
- 确定待导入文件的位置(路径)
- 确定sas文件保存路径
一般来说,数据经过这两部都能成功的导入到数据集中,但前提是你的数据格式能满足导入需求。多数情况会遇到以下问题: - sas不支持数据的格式,这个问题需要通过外部软件将数据文件进行转码成相应的格式,例如xls文件转为csv文件
- 导入后生成的数据集有乱码、缺失值、行列信息错误,这个需要根据生成的sas文件特定地修改代码
- 导入超大型文件,这个问题比较重要,笔者会单独写一篇文章讲述
INFILE语句的用法
还记得我们在上述操作中保存的sas文件吗,让我们打开来看看
PROC IMPORT OUT= WORK.STUDENT1
DATAFILE= "D:\sas\笔记\student1.csv"
DBMS=CSV /*提示文件类型为CSV*/ REPLACE /*替换同名文件*/;
GETNAMES=YES;
DATAROW=2;
RUN;
这里用到了IMPORT
语句读取文件,同时我们可以用INFILE
语句读取此csv文件
分隔符及选择读取
DLM
指示文件分隔数据的方式,如csv文件使用逗号分隔数据,xls文件使用制表符(tab)分隔数据FIRSTOBS=2
指示从第二行开始读取数据(区别与通常认识的编程语言,以0 1 2 3的方式排序,懂的都懂)OBS=10
指示数据读取从第十行结束
FLOWOVER TRUNCOVER MISSOVER PAD 的使用方法
之前有提到过按列读取数据的代码,如下所示
同样的,我们用INFILE
语句来读取这一类型数据
FLOWOVER
对比一下在数据阵列中读取,是不是哪里不太对劲
这提示我们sas使用INFILE
读取数据时,默认的读取方式是FLOWOVER
,这个和之前写到的有关INPUT
读取变量的逻辑有一点相似
情况是这样的:
程序按照指定格式从文件中读取变量,当本行数据无法满足某变量的读取要求时(如长度不足),程序就会从下一行数据中读取此变量。这样就可以解释以上现象,这也是FLOWOVER的含义
MISSOVER
MISSOVER
的含义是:读取变量时若某变量的读取无法被满足,则将此变量标记为空值,而不是从下一行数据中读取变量,但是city变量中只有长度最长的chongqing被读取到了,其他未读满的值都被标记为了空值
PAD
如果在代码中加入pad
语句
情况一下就明朗了,PAD
的原理是在读取数据时在每一行尾用空格补齐数据至最长,所以可见数据被完整的读取出来了,文件中未被指示的数据即被读取成了空值。
但是,问题又来了,如果不按列读取会怎么样?
果然,数据读取又出现了错误。细心的朋友可能会观察到和最开始讲述FLOWOVER的原理时所指示的结果十分相似,我们或许可以试试再加上MISSOVER
语句。
可以看到在联用了MISSOVER
和PAD
语句后,数据读取又变成了我们想要的样子。可见 PAD
语句是不会阻止FLOWOVER
语句生效的,但是MISSOVER
会。
TRUNCOVER
事实上上述案例也就是TRUNCOVER功能的拆分,如下
上述文件中未调整city变量的长度,所以会出现读取不全的结果,请谅解,谢谢
小结
本节介绍了如何从文件中读取数据,下一节将介绍如何建立逻辑库、读取已生成的数据、对变量的删改等操作
本文参考了 imasaor的博文-终于总结了一下,truncover,missover, pad选项的意义,以及读取datalines和外部文件的不同。
(考完就发下一节,大概。。)