SAS导入外部文件方法汇总与程序剖析_第1页
SAS导入外部文件方法汇总与程序剖析_第2页
SAS导入外部文件方法汇总与程序剖析_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SAS导入外部文件方法汇总与程序剖析蒲星月(天津商业大学 ,天津 300134)摘 要 数据读入是利用 SAS 软件进行数据分析等操作的最关键的一步 ,本文从 SAS 数据读入三大方法(列输入、列 表输入和格式输入法)出发 ,以 SAS9.3 软件版本为操作平台 ,全面介绍了各种类型的文本文件数据导入 SAS 的程序。 面向初学者的角度 ,每种方法下均给出范例 ,并详细解释了所使用的语句和语法的含义。关键词 SAS 导入 ;外部文件 ;方法汇总 ;程序剖析中图分类号 :TP3文献标识码 :A文章编号 :1671-7597(2014)18-0119-031 引入数据的导入对使用 SAS 软件来进

2、行数据分析等是最开始 的一步 ,也是至关重要的一步。SAS 可以读入包括文本文件、 Excel 表格文件、Access、DB2、Oracle 数据库在内的多种数据 文件。 其中 ,Excel 表格文件、Access、DB2、Oracle 数据库 文件可以简单地由 SAS 文件菜单导入数据选项的向导完成 ; 而由于文本文件格式复杂 ,往往需要编程完成。根据数据类型 的不同 ,SAS 导入方法主要分为三大类 :列表输入、列输入和 格式输入法 ;当然还有许多分散的语句、语法用于导入数据。 本文主要从这三大方法着重介绍文本文件数据的 SAS 导入程序。 其中 ,infile 语句是贯穿全文的最重要的语

3、句 ,infile 语句 的功能十分强大 ,本文只介绍最常用的一些。2 列表输入(List Input)列表输入用于读已经用分隔符分隔好的数据的方法 :SAS 读入一个变量下的数据直到遇到分隔符停止 ,然后移动到找到 下一个数字开始。缺省分隔符为空格 ,分隔符的不同 ,列表输 入的程序会有很大不同。列表输入只适用于数据长度为 8 字节 以下的数值型数据以及字符型数据 1,列表输入不能读日期型 数据。且不能有选择的只读取其中某些数据。2.1 空格作为分隔符空格作为分隔符的数据的读入是最简单的 ,因为 SAS 中 , 默认空格为缺省分隔符。这里的空格可以是一个或者多个。File 1: D:newe

4、mployee.txt假设有数据 File1: “D:newemployee.txt”,其中每一列 分别代表某公司录取的新职员的年龄 ,性别 ,身高(cm)和体 重(kg)。数据用一个空格隔开。SAS 程序为 :data newemployee;infile D:newemployee.txt;input Age GenderHeight Weight; run;这个程序中 ,data 语句后面是这个数据存在 SAS 逻辑库中的名字 ,这里 newemployee 数据存在 SAS 临时数据库 work 中。程序中的 infile 语句是用来告诉 SAS 源数据文件的地址 ; input 语句

5、告诉 SAS 源数据有多少个变量、变量的类型和名称 , 默认的变量类型是数值型 ,因此数值型数据不用特别指明 ,直 接写出变量名称即可 ;其他类型的变量需要在变量名后面指出 其类型 ,字符型变量加“”。这个例子中 ,因为 Gender 性别 是字符型 ,所以在 Gender 后面加“”。由于分隔符是空格 ,所以需要注意每一个变量对应的每一个数据中不能出现空格(比如外国人的名字 Lee Cooper)。另外, 若存在缺失值 ,且缺失值未做任何处理 ,只是用空格代替 ,是 行不通的 ;列表输入下 ,必须在原数据上就处理好缺失值 ,比 如用“.”表示。2.2 逗号作为分隔符用逗号作为分隔符的文件在

6、叫“CSV” 文 件 ,是 comma- separated values 的缩写 ,若用文本文件格式打开 ,会自动生 成作为分隔符的逗号。若 file1 中的分隔符全部由空格换成了 逗号 ,只需在 infile 语句后面加上“dsd”。dsd 是 delimiter-sensitive data 的缩写 ,有如下三个作 用 :第一 ,把缺省分隔符由空格改为逗号 ;第二 ,如果连续出 现两个逗号 ,默认之间有一个缺失值 ;第三 ,如果原数据中字 符型数据被引号引起来(无论是单引号还是双引号),SAS 会把 引号去掉。程序如下 :data newemployee;infile D:newempl

7、oyee.txt dsd; input Age Gender Height Weight;run;在设置了 dsd 的情况下 ,即使在逗号中又混合使用了空格 也不影响。因为列表输入工作原理是一样的 ,这里只是把缺省 分隔符换成了逗号 ,即默认从某个数字开始读 ,读到逗号为止 , 然后移动到找到下一个数字开始读下一个数据。另外 ,若该数据文件的格式为 csv,那么除路径结尾为 “.csv”外 ,仍可使用该程序。2.3 Tab 作为分隔符Tab 是制表跳格符 ,相当于 8 个空格 ,其应用相当广泛 , 比如许多股票软件(如“同花顺”)导出的数据都是用 Tab 作为 分隔符的。若 file1 中的分

8、隔符全部由空格换成了 Tab,其导入 程序为 :data newemployee;infile D:newemployee.txt' dlm=09x; input Age GenderHeight Weight;T技术应用ECHNOLOGY APPLICATION run;这里在 infile 语句后添加的 dlm 是 delimiter 的缩写 ,在 此处添加“dlm=”表示指定一种分隔符 ,等号后面即为制定的 分隔符。因为 Tab 的表现形式是 8 个空格 ,不可能在“dlm=” 后面输入空格。所以 ,此处用“09x”表示 Tab 形式。需注 意的是 ,“09x” 是在 ASCII

9、 下的表现方式 ,运用于所有的 windows 平台和 UNIX 操作系统。如果是在 EBCDIC 下的 Tab,则 用“05x”表示 ,即“dlm=05x”。2.4 其他分隔符除了 Tab 这种不可视的特殊分隔符以外的其他分隔符的列 表输入法 ,都可以用前文提到的 dlm。比如 ,如果分隔符是“:”, 那么程序如下 :data newemployee;infile D:newemployee.txt dlm=:; input Age Gender Height Weight;run;并且 ,dlm 还可以 dsd 同时使用 ,不分先后顺序。这时 , dsd 还是会有前文提到的三个作用 ,只是

10、其中的逗号会变成 dlm 后指定的分隔符号。3 列输入(Column Input)不同于已经使用分隔符分隔好的数据 ,有很多数据集是没 有用分隔符隔开的 ,这些数据的导入就不能使用列表输入法。 这些数据往往将特定的信息存于固定的列中 ,这样做的好处在 于 ,不必担心缺失值的处理 ,并且当你读入 SAS 的时候可以有 选择的读入你需要的某些数据。读这类数据可以采用列输入或 者格式输入法 ,这里先介绍列输入法。列输入是最简单的用于导入不同变量有固定的某列或某几 列的类型的数据。但只能读字符型和标准数值型数据值 ,标准 数值型是指指包括数字、小数点、正负号或者 E 表达的数值 , 比如 3.4E3,

11、而例如像表示金额的数值因为含有逗号或者货币符 号不是标准数值型数据 ,因此不能使用列输入法。File 3 D:salary.txt假设有数据 File3:”D:salary.txt”。数据中的第一排是 人为添加上去 ,帮助数列数的 ,实际数据中并没有该行。可以 数出 ,第 1-2 列是职工编号 ,第 3 列是性别 ,第 4-14 列是出生年月 ,第 15-22 列是职工基本工资 ,第 23-30 列是职工补贴 , 这就是一个固定列数的数据。将这个数据集导入 SAS 的程序 如下 :data salary;infile d:salary.txt;input No 1-2 Gender 3 DOB

12、 4-14 Salary 15-23 Welfare 26-32 Name 39-45; run;这里 ,infile 语句后面仍然紧跟源数据路径 ,而 input 后 不再单纯只跟变量名和类型了 ,还要再在变量名和类型后面加 上该变量指定的列数。需要注意的 ,源数据每一个观测值(即 每一行)结尾的地方 ,也就是最后一个变量值一定要填满规定 的列数。比如 salary 的例子中 ,最末列是变量 Name,在固定的 39-45 列 ;但 Sky 这个观测值 ,只有三个字符 ,占第 40-43 列 ,那么还需要在其后加上两个空格填满第 44-45 列。如果不这样 做 ,SAS 默认读完 Sky 三

13、个字符后 ,会以为这个观测值还没有 完 ,从而从第二行开始寻找 ,找到第二行的 12 来填满所需求的 39-45 列 10 列的固定列 ,这是整个数据就产生了读入混乱。解 决这个问题还可以把最末的数据右对齐 ,还可以调用 pad 语法。 若读取列中只有空格或者“.”,那么 SAS 作缺失值处理。另外一点需要注意的是 ,因为列输入只能读字符型和标准数值 型 ,所以这里把出生日期处理为字符型数据。4 格式输入(Formatted Input)格式输入是最常用 ,也是最万能的一种读入数据的方法 , 与列输入一样的是 ,它也是用于定义好固定列的数据。跟列输 入和列表输入对源数据有严格限制不同 ,用格式

14、输入法输入的 数据既可以是字符型或者标准数值型 ,也可以是非标准数值型(含逗号或货币符号)和各种格式的日期型数据。也就是说 ,只 要数据是不标准的数据但仍然有固定的列 ,就用格式输入。假设还是输入上面的数据 ,这里为了更加详细地了解货币 的输入,在职工工资前面加上美元符号。这里需要注意一个问题, SAS 中只能显示美元符号。若是文本文件输入 ,带其他货币符 号的数值会无法读入 ;若是其他数据库或者 excel 表格文件导 入 ,SAS 会自动转换为美元符号。程序如下 :data salary;infile D:salary.txt;input 1 No 2. 3 Gender 1. 5 DOB

15、 mmddyy10.16 salary dollar10.227 welfare 7.2 35 name 6.;run;程序中的 是格式输入的标志 , 就像一个指针指向某一列, 比如 3 就是告诉 SAS 指向第 3 列的。指明列数以后 ,写变量名 , 变量名后面是该变量的格式 ,包括数据类型、位数。位数输入 的标准格式应该是“w.d”,“w”是该数据的总位数(包括符号 和小数),“d”是该数据的小数位数 ;如果是整数 ,那么 d 可以 输为 0 或者不输。比如 ,这个数据里的职工补贴 welfare 是一 个最长占 7 位(包括小数和点),其小数部分有两位 ,则位数输 入应该是“7.2”。如

16、果是字符型数据 ,除了指明位数 ,还需要 在位数之前首先指明该数据类型 ,其格式应该是“w.”这里 肯定没有小数位数 ,所以没有 d。如果是日期型数据 ,其格式有 多种 ,本文总结了所有类型的数据(见图表 3)2。在 salary 这个数据中的出生日期是按照“mm/dd/yyyy(日 / 月 / 年)”组 织的 ,需要把这个格式告诉 SAS,所以程序中的“mmddyy10.” 就是这个作用 ,“10.”同样指的是包括“/”一共占有 10 个字 符位。需要注意的是 ,日期型数据在 SAS 中的储存是按照距离 1960年1月1 日有多少天来的 ,所以 salary2 这个数据在 SAS 中 ,如果

17、不做任何处理 ,显示如图表 1。其中 ,出生日期(DOB) 是按照计算到 1960年1月1 日的天数显示的。比如 ,1960 年1 月 1 日就是 0。表1 表2 120 硅谷SAS格式源数据形式日 期 型datew.ddmmmyy/ddmmmyyyy(mmm为月份英文缩写)datetimew.ddmmmyy hh:mm:ss.ssddmmyyw.ddmmyy/ddmmyyyyjulianw.yyddd/yyyyddd(Julian儒略日日期)mmddyymmddyy/mmddyyyytimew.hh:mm:ss.ss数 值 型w.d标准数值型hexw.16进制数据读入为浮点型数据ibw.d二

18、进制数据percentw.百分数commaw.d含逗号、货币符号的数据,负数表示为括号 的数据字 符 型charw.字符数据读入不删除前后空格hex16进制数据转化成字符型w.标准字符,删除前空格5 列输入法和格式法混合使用在前文中 ,格式化输入中的格式定义可以运用到列输入中。 这个方法针对那些有分隔符但是其中包含字符超过 8bytes 数值 型数据或者其中有日期型数据的文本文件或者 CSV 文件。File 5 D:salary2.txt假设有数据“D:salary2.txt” ,其中第一列是编号(首 位有 0,只能处理成字符型),第二列是姓名 ,第三列是出生日 期(日期型),第四列是工资。程

19、序如下 :data salary2;infile D:salary2.txt dsd;input No :2. Name : 18. DOB : ddmmyy10. salary : dollar10.2;run;程序中“ :”是该方法的标志 ,告诉 SAS 读入数据时候按 照“:”后面的格式读入 ,但是遇到分隔符就停下。如果没有“:”, SAS 会一直读数据 ,直到满足后面的格式位置。这里还有一个问题 ,如果姓名里有空格隔开 ,而刚好分隔 符也为空格 ,那么还需要做如下处理 :第一 ,源数据中的姓名 变量与后一项变量出生日期之间需要两个或以上的空格 ;第二 , 程序中 ,姓名后面的“ :”改

20、为“&”。程序如下 :data salary3;infile D:salary3.txt;input No :2.Name & 18. DOB : ddmmyy10.3 结论计算机网络技术是人类社会发展的一个重要的文明成果 , 它已经渗透到社会的各个领域当中 ,并且在其中发挥着十分重 要的作用。计算机网络技术对社会的发展具有促进的作用 ,已 逐渐成为推动社会发展的重要力量。各界都应该掌握计算机网 络技术的相关知识 ,并且需要科学合理地使用该先进的计算机 网络技术 ,以促进本行业能够快速的发展和不断进步。参考文献1谭同灿.计算机网络技术的应用及其发展J.计算机光盘软salary

21、: dollar10.2; run;6 infile 语句补充语法有一些词可以加在 infile 语句末 ,就像前文提到的 dsd 和 dlm 一样。这些词往往有特定的功能用来处理一些特殊的数据 输入。并且这些词都可以叠加使用。使用哪几个就在 infile 语 句后面加上某几个(顺序不限)。1)firstobs。firstobs 用来指定从源数据文件的哪一行 开始导入。这个特别广泛地用在源数据的第一行是变量名称的 时候 ,或者正如前文在第一行加入了方便定列数的编码的情况 下 ,这种情况下的程序 :input源文件地址firstobs=2;2)obs。obs 用来指定导入的数据到源数据文件的哪一行 终止。这个广泛应用在某些程序测试或者误差分析等情况下 , 与 firstobs 功能对应。假设这里只读入 100 行以前的数据 ,程 序为 :input源文件地址obs=100;3)missover。missover 用在当某一行的某些数据有缺失 , 防止 sas 从第二行寻找来补足缺失的情况。具体来说 ,如果定 义的变量有十个 ,但某行只有 9 个 ,如果不用 missover,那么 SAS 会到下一行搜索第一个数据来补足十个 ,会导致后面的数 据都出错 ,而 missover 就是阻止这种情况的。程序为 :input源文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论