【SAS Says】基础篇:2. 读取数据

转载请在文章开头注明微信号:shushuojun,谢谢!

本节数据中,我们将介绍SAS读取数据的三种方式:

list input、column input、informats

它们各适用于什么情景,如何综合利用这三种方式读取数据?如何读取凌乱的数据?

以及一些小技巧,比如如何让SAS只读取第3到第5行的数据,读取EXCEL时,如何指定读取某个sheet等等

目录:

2.1 将你的数据放入SAS

2.2 用Viewtable窗口输入数据

2.3 用导入向导(Import Wizard)读取文件

2.4 告诉SAS你的数据在哪

2.5 List input 读取空格分开的数据

2.6 Column input读取固定排列的数据

2.7 Informats读取非标准格式的数据

2.8 用可选变量形式

2.9 混合读取方式

2.10 读取凌乱的原始数据

2.11 跨行观测值的读取方式

2.12 一行有多个观测值的文件读取

2.13 读始部分观测值

2.14 用infile的选项控制输入

2.15 用数据步读取分隔符文件

2.16 用导入过程(import procedure)读取分隔符文件

2.17 用导入过程(import procedure)读取PC文件

2.18 用DDE读取PC文件

2.19 临时和永久数据集

2.20 用LIBname语句使用永久数据集

2.21 通过直接指代使用永久数据集

2.22 列出SAS数据集目录


【SAS Says】基础篇:2. 读取数据

2.1 将你的数据放入SAS

你可能有各种形式的数据,包括手写在纸上、存放在电脑上、或是在数据库管理系统里,不论如何,总有一种方法可以让SAS来读取。

SAS读取的数据的方法主要有以下几种类型:

  • 直接输入;
  • 从原始数据文件中创建一个SAS数据集(creating SAS datasets from raw data files);
  • 将其他软件中的数据文件转换成SAS数据集;
  • 直接读取其他软件的数据集;

直接输入

  • Viewtable窗口可以让你以表格形式输入数据,可以定义变量、设置属性,如name、length和 type(character or numeric).
  • SAS 企业向导模块,a Windows onlyapplication,has a data entry window that is very similar to the Viewtablewindow.As with Viewtable,you can define variables and give them attributes.
  • SAS/FSP 模块,是Full ScreenProduct的简称,可以设计定制的数据输入窗口,也有检测数据输入错误的功能(The SAS/FSP product is licensed separately from Base SAS software.)。

从原始数据文件中创建一个SAS数据集 你有两种方法读取原始数据文件:

  • 数据步可以读取任何形式的原始数据文件,这种方法还将在2.4中详解。
  • 导入向导(Import Wizard)、导入过程(IMPORTprocedure)适用于UNIX、OpenVMS和 Windows操作环境的简单方法,可以读取CSV(comma-separated values)和其他一些限定的文件类型。

将其他软件中的数据文件转换成SAS数据集 如果数据在一个软件中以某种格式存放,但需要用另一种软件分析时,就会很麻烦。有几种方法可以将某种软件中的数据转换成SAS数据集:

  • 如果安装SAS/ACCESS模块,可以用导入过程(importprocedure)和导入向导(Import Wizard)将Excel、Lotus、dBase和Access文件导入SAS数据集,见2.3和2.17(?)。
  • 如果没有安装,可以用存放数据的软件创建一个原始文件,并用数据步或导入过程(import procedure)读取。很多软件都可以创建CSV文件。
  • Windows操作环境下也可以用动态数据交换技术(Dynamic Data Exchange,DDE),见2.18。前提是必须有一个其他的Windows程序与SAS同时运行,再使用DDE和数据步。

直接读取其他软件的数据集

  • SAS/ACCESS产品可以不用转换数据格式读取数据,并适用于大部分大部分数据库管理系统,包括ORACLE,DB2,INGRES和 SYBASE(但使用方法本书没有介绍)。
  • 使用Excel engine和Access engine来读取这两种类型的数据。(SAS帮助文档)
  • 还有其他的一些数据引擎(data engines)来读取数据,如SPSSengine(附录D),查找帮助文档找到适合你操作环境的所有有效engine。

2.2 用Viewtable输入数据

调用Viewtable窗口,在工具栏的下拉菜单中选择表编辑器(Table Editor)。

列属性窗口 每一列顶部的字母是默认的变量名,右击变量名,即可打开列属性(column attributes)窗口,设置属性之后,点击应用(apply),设置完后关闭即可。

输入数据

保存表 选择文件(file)——另存为(save as),选择一个逻辑库保存,如果想保存在新的逻辑库,点击创建新逻辑库图表(New Library),输入逻辑库的名字和保存路径。

打开一个已有的表 首先打开表编辑器,选择文件(file)——打开(open)。打开之后,SAS默认的是浏览模式,如果要对数据进行编辑,则要在编辑(edit)菜单中选择编辑模式。也可以在资源管理器窗口中双击打开一个已有的表。

其他功能 其他一些功能包括排序、打印(printing)、增加和删除行、一次浏览一行(窗体视图Form View)、一次浏览多行(表视图 TableView)。图标和菜单都可以选择这些功能。

在SAS程序中使用表 如下程序语句可以将表内容输出打印:

PROC PRINT DATA=Sasuser.coffee;

RUN;

2.3 用导入向导读取文件

导入向导会浏览你的文件以决定变量的类型,并默认数据表的第一行存放变量名。

第一步,从文件(file)下拉菜单中选择导入数据(import data)导入向导(ImportWizard)

第二步,从standard datasources中选择要导入的数据类型。以commaseparated values(*.csv)为例。点击下一步

第三步,指定要导入的文件位置,SAS默认第一行存放变量名,从第二行开始存放数据。Options可以改变这种默认选择。

第四步,选择数据集要存放的逻辑库,并为数据集取一个名字(member)

最后,导入向导创造一个proc import语句,可以是SAS再次导入这个数据。

另外,对于一些类型的数据文件还有额外的步骤,比如Microsoft Access文件,你需要输入数据库名和药导入的表名,有时甚至还要输入user的ID号和密码。

在SAS程序中使用导入数据 比如你将数据存放在work逻辑库,并署名为flowers,那么你可以这样来输入它:

PROC PRINT DATA=WORK.flowers;

RUN;

由于work是默认的逻辑库,所以也可以直接这样:

PROC PRINT DATA=flowers;

RUN;

2.4 告诉SAS你的数据在哪

如果数据是原始数据(比如text,ASCII,sequential,flat files),那么用数据步来读取能带给你最大的灵活性。但首先你要告诉SAS你的原始数据在哪。

原始数据可以通过文本编辑器(text editors)或系统命令。对PC使用者来说,原始数据没有相关联的应用程序(就像doc文件与word相关联,双击doc程序就默认调用word程序以打开),有时他们会与像Microsoft Notepad这样的简单编辑器相关联。

内部原始数据 如果直接将数据输入SAS程序中,那么数据就是SAS内部数据。DATALINES是一个指示,告诉SAS下面跟着是数据行,直到分号结尾,这个分号可以另起一行,也可以接在数据的后面。也可以用card代替DATALINES。下面是一个程序,这个程序创建了一个USPRESIDENTS数据集。(Input语句还将在2.5和2.15中讨论)

外部原始数据 数据外SAS程序外部时,使用INFILE语句告诉SAS外部数据的文件名和存放路径,它在data语句之后,在INPUT语句之前。INFILE后面的文件名和路径要用引号,各种系统的引用方式各不同:

假设有一个President.dat数据在你的C盘的MyRawData目录中,

那么可以用如下方式引用这个外部数据:

SAS日志 读取外部数据时,SAS日志会给一些很有用的信息,检查这些信息可以解决一些问题,比如对比INFILE语句读取的记录数和数据集中实际观测值,可以确定SAS是否正确的读取了数据。上面程序的日志如下图所示,

过长记录 在一些操作环境中,SAS假定外部数据文件的记录长度为256或更少(记录长度是指某行中的字符数,包括空格),如果长度过长,SAS不能读取全部,此时需要在INFILE语句中使用LRECL=来指定长度,这个长度必须是数据中最长行的长度,如:

INFILE’c:\MyRawData\President.dat’LRECL=2000;

可以通过SAS日志来查看最大记录长度。

2.5 List input读取空格分开数据

如果原始数据都至少被一个空格分开,那么用list input读取数据可能是正确的。Listinput是一个很简单的读取数据的方式,但是会受到很多限制。你必须读取所有的数据记录,不能跳过某些值、缺失值必须用句号“.”代替。字符串数据不能包含空格、长度不能超过8个字符。而且如果数据文件包含日期变量或者其他需要特别处理的变量,list input将不再适用。虽然很多限制,但仍有大量的文件可以用这种方式读取。

INPUT语句是数据步的一部分,它告诉SAS如何读取原始数据。使用List input来写input语句:在INPUT关键词之后列出变量名(按照变量在文件中出现的顺序),变量名长度在32个字节(含)以下,只能包含字母、下划线和数据,并必须以字母或者下划线开头。如果变量是字符串,后面要价“$”号,值与值之间至少有一个空格,语句要以分号结束。如:

这表明输入三个变量,其中name是字符串,age和height是数值变量。

例子 你想组织一次青蛙跳跃比赛,现在你记录了每只参赛青蛙的名字、体重、和三次跳跃的距离,如果某次的跳跃距离不合格,那么就用“.”代替,数据文件ToadJump.dat形式如下:

虽然不是很整洁、但满足list input的所有要求(字符串长度小于8个字节、不包含空格、值之间都有至少一个空格,缺失数据也用句号代替)。Nosiy的数据溢出到第二行了,但这不影响,SAS会按照变量顺序自动跳到下一行读取。如下是读取这个数据的SAS程序:

Input后面是变量名,ToadName是字符串变量,其他是数值变量;proc print过程用来输出数据集中所有的变量和观测值;title语句用告诉SAS输出顶部的标题,如果不指定标题,SAS将以“the SAS system”作为标题在每一页的顶部。输出的形式如下:

由于Noisy的数据溢出到下一行,因此下面的说明会出现在SAS日志上:

2.6 Column input读取固定排列的数据

当一些原始数据的值之间没有空格分开,或者没用用句号代替缺失值时,list input就不能用。但当每个变量的值都出现在数据行的相同位置时,并且变量值是字符串或者标准数值(只包含数据、小数点、正负号、和科学标注的E。逗号和日期都不能算)时,可以使用column input来读取。

相比list input,column input有如下优势:

  • 不要求变量值之间的空格;
  • 缺失值可以直接用空格代替;
  • 字符串中可以包含空格;
  • 可以跳过不需要的变量。

调查数据使用column input,因为调查答案的记录都是用单个数字(0-9),如果每个答案之间再用空格分开,就会使整个文件会扩大两倍。有地址的数据文件也使用 column input,因为地址之中常常包含空格,比如街道Martin Luther King Jr.Boulevard在column input中就可以当成一个变量而不是五个。可能用column input读取的数据也可以用formattedinput读取或者几种方式组合。

Column input的input语句格式如下:input关键字后接变量名、再接变量的列位置(列位置是字符或者数值在一行中的位置)。字符串变量名后仍要用“空格+$”,变量名之间仍要用空格隔开。示例如下:

这个语句表明,Name变量,在行中占据第1列第10列,为字符串变量,age占据第11-13列,为数值变量,height占据第14-18列,数值变量。

例子 原始数据记录如下:

读取这个数据的column input程序如下:

第一个变量visitingteam占据第1-20列,为字符变量;concessionsales占据第21-24列,为数值变量,下面几个变量均占据固定的列。输出结果如下:

2.7 Informats读取非标准格式的数据

有时候原始数据不全是字符串或者数值,比如类似1,00,001这样包括逗号的字符串值,电脑就不能读取,其他诸如包含美元符号、十六进制、压缩十进制的数据都是非标准数据。SAS中,informats可以用来告诉电脑如何读取这样的数值。

日期是最普通的非标准数据,SAS informats会把类似10-31-2003或者31OCT03转换成数字,日期的起点为1960年1月1日,即这一天的数字为0。

Informats的三种普遍格式为:字符串、数值、日期。这三种格式的形式如下:

$代表是字符串、informats代表形式(比如日期的MMDDYY)、w是宽度、d是小数点的位数、最后是句号“.”,缺少句号会使得SAS把形式(如MMDDYY)当做变量名。一个简单formatted input的简单INPUT语句如下:

Name为字符串变量,占据10个宽度,即列位置从1-10;age为数值变量,占据3个宽度,列位置从11到13;height也为数值变量,占据5个宽度,包括了1位小数点和小数点本身,列位置从14-18(如150.3);最后是日期变量,从第19列开始,形式为MMDDYY。

例子 原始数据如下:

读取这个数据的informat程序如下:

年龄后面的+1代表跳过一列,即原始数据中年龄后面有一个空格。最后的5个变量score1-score5,都要求有同样的形式,4.1。将变量名和形式分别放在两个括号集中,可以一次性定义很多变量。输出结果如下:

2.8 可选变量形式

一般使用的变量形式的定义,以及它们的宽度范围和默认宽度如下:

2.9 混合读取方式

每种数据读取方式都有其优势,list最简单,column和formatted虽然复杂但是不要求变量之间的空格,并且变量名中可以包含变量,而且formatted可以读取特殊的数据比如日期。SAS可以灵活的让你搭配不同的读取方式,以达到最大的方便。

例子如下的原始数据记录了美国国家公园的信息:姓名(name)、所属周(state)、建立时间(year established)、占地面积(size inacre):

有多种方式进行数据读取,下面的程序是方式之一:

其中ParkName是column方式读取,State和Year是list方式读取,Acreage是formatted方式读取,输出结果如下所示:

混合读取方式有时会遇到问题:SAS通过一个指示器标注位置,来读取原始数据的一行,但每种读取方式对指示器的使用稍有不同。List方式下,SAS自动找到非空格区域并开始读取;column方式下,SAS读取你所指定的特定位置;informatted方式下,SAS不理会指示器的标准,只是依次的读取。这时,就会需要列指示器@n,来人为的让SAS的读取直接跳至某列。

在上面的程序中,列指示器@40告诉SAS在读取Acerage变量之前,移动到第40列去,如果移去指示器,程序为:

输出结果如下图所示:

之所以出现这样的结果,要看原始文件的列坐标排列:

Comma9告诉SAS读取9列,SAS就会读取包括空格在内的9列,这便会导致输出结果的问题。

2.10 读取凌乱的数据

有的数据排列混乱,长度不一。这样的数据需要新的工具处理:@’character’ 列指示器和colonmodifier。

@’character’列指示器 2.9中提到@column列指示器可以让SAS直接从某列开始读取数据。但有时候你不知道要读取的数据是从哪列开始,此时你只要知道要读取的数据的前面那个字符或单词即可。比如有一个关于狗的原始文件,你想要读取狗的品种号,但文件排列很凌乱,只知道品种号跟随在单词breed后面,那么可以用如下方式读取:

Input @’Breed:’ DogBreed $;

colonmodifier 由于input读取字符串变量默认为8个字符,因此在上例中如果狗的品种名(dogbreed)超过8个字符,则需要定义长度,定义为$length,在该长度中,空格也算在内。如果要使SAS读取过程中遇到空格则不再继续读取,则要在$length前面加冒号“:”。比如原始数据中有这么一行:

My dog Sam Breed:Rottweiler VetBills:$478

如果用上述不同方法读取,会有不同结果:

例子 web日志是凌乱数据的一个很好例子,下面是一个网站的web日志,数据开始于访问IP,后面有访问日期、访问文件名等信息。

现在想要读取访问日期和访问的文件名,但是它们每行中所占据的列的位置都不同,而且文件名的长度每行都不一样,那么SAS读取这种文件通过如下方式:

@’[’作为列指示器,告诉SAS读取[之后的内容,@’GET’告诉SAS读取GET之后的内容,由于文件名作为字符串变量,这里基本都会超过8个字节,因此后面附加:$20。输出结果如下:

2.11 跨行观测值的读取方式

一般原始文件中一行代表一个观测值,有时会出现一个观测值跨行的情况。由于SAS会自动转到下一行读取数据,直到读取这个观测的所有变量(input语句中给出),所以你需要告诉SAS什么时候不要换行,以便在日志中不出现SAS-went-to-a-new-line的暂停说明,此时需要在INPUT语句中加行指示器。

行指示器 斜线/:告诉SAS跳至原始数据的第二行;#n:跳至第n行,n代表原始数据中某观测值的行数(#2则让SAS跳至某观测值的第二行),#n不能用来回跳。

例子 有一组关于温度的数据,temperature.dat第一行代表城市和州,第二行代表本日最高温和最低温,第三行代表史上最高温和最低温。

用如下的程度来读取这份数据:

Input后面告诉SAS读取第一行的city变量和state变量,斜线/告诉SAS移动到下一行的第一列,以便读取normalhigh和normallow。#3告诉SAS移动到第三行的第一列以便继续读取观测值的recordhigh变量和recordlow变量。这里/可以用#2代替,也可以用/代替#3。

日志记录如下:

从日志中可以看出,虽然原始原件占了9行,但只有三个观测值。

输出结果如下:

2.12 一行有多个观测值的读取

当一行出现多个观测值时,可以在input语句结尾加一个停止符号@@

例子有一个关于降水量的数据,precipitation.dat,文件包含城市名、州名、月平均降水量、月平均降水天数:

这个数据文件中,第一行包含了两个观测值,可以用@@的程序读取:

日志记录如下:

中间的说明,SAS went to a new line when INPUT statement reached past the end ofa line.是指读取第二个值时达到第一行末尾,并转到下一行继续读取。

输出结果如下:

2.13 读取部分观测值

有时候只需要读取原始数据的部分观测值,比如只需要年鉴中的女性数据、收入超过10万的人口数据等。

此时的数据读取方式如下:在SAS读取某一行观测值时,首先读取足够的变量以便决定是否需要保留此行的观测值。然后在input语句结尾加符号@,叫做a trailing at(called atrailing at),这告诉SAS先停在(hold)此行,同时用IF语句检测此观测值是否满足需要,如果是,那么可以再用一个input语句来读取现有的变量。

例子有一个关于当地交通的数据,traffic.dat数据包含街道的类型(freeways和surface)、街道类型、早晨每小时的机动车流动量、晚上每小时机动车流动量。

如果现在你只需要freeway的数据,可以用下述程序:

第一个input读取字符串变量,@是SAS停留在观测值上并用IF检测,第二个input读取input后面的变量值。

程序执行后日志包括两部分说明,一个说明读取了8个记录,另一个说明新数据集中只包含三个观测值。

输入结果如下所示:

@vs @@ @的作用类似于@@,都是行停留指示符(line-holdspecifiers),不同地方在于停留多久,@能使SAS停留到下一个input语句(也不换行),@@能使停留的时间到下一个data步(也不换行)。

比如这段代码:

datatest;

infile cards ;

input x @;

input y;

input z @@;

cards;

1 2 3 4 5 6

7 8 9 10 11 12 13 14 15 16 17

;

run;

test输出结果就是

2.14 用infile的选项控制输入

读取原始数据时,SAS做了某些假设,比如从第一行开始读取数据,对于跨行观测值,会自动转到下一行继续读取。但有的特殊数据不满足这些假设,infile语句中的选项可以让SAS读取这些特殊数据。

FIRSTOBS= FIRSTOBS= 选项告诉SAS从哪一行开始读取数据,当数据开头有些说明信息,或者想要跳过某些行时,这个选项很有用。例如,如下原始数据文件中,开头两行是关于数据的描述:

那么用如下程序可以让SAS从第三行开始读取数据:

OBS= OBS=告诉SAS一直读取到哪一行位置,注意是行而不是观测值(有的观测值占据多行)比如,如下的原始数据文件中,结尾处还有一句不需要的数据说明时。就需要这个选项:

用FIRSTOBS=3和OBS=5就可以读取第三行到第五行的数据:

MISSOVER 在input语句中输入的几个变量,SAS在观测值中就读取几个变量,如果一行未读完,则进入下一行直到输入的变量都读取了变量值。missover可以让SAS不进入下一行读取,未赋值的变量就使其成为缺失值。当如下这种数据,就需要missover选项,一个学生应该有5门课的成绩,但由于最后两门是自学课程,不是所有学生都完成,故而缺失:

如下的程序可以让SAS将Nguyen第五门课的成绩设为缺失值,从而不牵扯到下一行:

Truncover 使用column input或formatted input输入时可能会需要这个选项,因为这时有的数据行比其他的短。如下的原始数据中,由于三行的长度都不一样,input中只能指定最长的一行:

程序如下:

这里指定了第二行的长度street $ 22-37,但是第一行maple ave.并没占够至第37列(注意后面是没有空格的),故而必须用truncover,否则会转到下一行继续读取,第三行情况也是。

2.15 读取分隔符文件

分隔符文件中,变量值之间会用一些特殊的字符隔开,比如逗号或制表符。DLM=和DSD选项可以让SAS容易的读取这些分隔符文件。

DLM= 用list input读取文件时,变量值之间应该用空格隔开。对于其他的分隔符,可以用DLM=,DELIMITER=选项来指定,从而可以读取文件。

例子如下的数据中,学生姓名、每周读的书的数目是用逗号隔开的:

用选项来指定分隔符即可:

如果原始数据是用制表符隔开的,那么可以使用DLM=’09’X来指定,因为制表符的十六进制值是09,如果你电脑使用EBCDIC(扩充的二进制编码的十进制交换码),那么应该用DLM=’05’X。

DSD DSD (Delimiter-Sensitive Data)有三个作用:忽略引号中数值的分隔符;自动将字符数据中的引号去掉;将两个相邻的分隔符当做缺失值来处理。并且,DSD默认分隔符为逗号,如果数据中的分隔符不是逗号,那么要用delimiter来指定。比如,读取一个制表符为分隔符、并且用两个制表符代表缺失值的数据文件,则要用下面的语句:

INFILE ’file-specification’ DLM=’09’XDSD;

CSV文件 CSV文件,Comma-separatedvalues files,是可以用DSD选项的文件类型。Excel可以储存CSV格式的文件。

例子 某咖啡馆,老板每晚请不同的乐队表演来吸引顾客,他记录了乐队名称、演出日期、晚上8点、9点、10点、11点的顾客数量:

注意,其中有一个乐队的名字中用逗号来分隔,并且使用了引号。最后一条记录中还有一个缺失值,用两个连续的逗号表示。INFILE语句中的DSD选项可以用来读取这个文件,并且,由于每个记录长度不一样,还需要用missover:

注意bandname和GigDate两个变量使用了冒号修改器,冒号修改器告诉SAS读取信息的长度(BandName为30,GigDate为10)。输出结果如下:

2.16 用导入过程读分隔符文件

Proc import会浏览你的数据文件,自动决定变量类型(字符串或数值),为字符串变量分配正确的长度,辨认出日期变量。Proc import会将两个连续的分隔符视为缺失值,会读取引号中的变量值。一行读完后,会自动分配缺失值给未赋值的变量。Also,if you want,you can use the first line in your data file forthe variable names。导入过程(IMPORTprocedure)自动问你写下数据步,这可以在提交之后的日志窗口中查看。

一个导入过程(IMPORT procedure)的最简单形式:

PROC IMPORT DATAFILE=’filename’ OUT=data-set;

用语句DATAFILE=’filename’读取文件名,用OUT=data-set创建SAS数据集。SAS会通过文件的扩展名来检测文件的类型:

如果文件没有正确的扩展名,或者是DLM格式的,必须在proc import语句中用DBMS=option。如果想要创建的数据集名字已经存在,那么要用replace选项代替。一个使用replace和dbms的例子。

PROC IMPORT DATAFILE=’filename’ OUT=data-setDBMS=identifier REPLACE;

导入过程(IMPORT procedure)从数据文件中的第一行获取变量名,可以通过在PROC IMPORT后面增加GETNAMES=NO语句来改变这种默认,PROC IMPORT会分配给变量名字:VAR1,VAR2,VAR3等。如果你的数据文件是DLM类型的,PROC IMPORT会假定分隔符为空格,用DELIMITER=可以改变默认的分隔符。如下是一段有上述代码的程序:

例子下面还是使用咖啡馆中,乐队表演的例子(2.15),注意其中有一个乐队的名字中用逗号来分隔,并且使用了引号:

用proc import读取数据的代码如下:

输出结果如下,注意GigDate的日期格式能够被proc import辨认出来:

2.17 用导入过程读PC文件

如果安装了SAS/ACCESS模块,导入过程(IMPORTprocedure)可以导入一些PC文件类型。它会浏览你的文件以决定变量类型,并默认使用数据的第一行来分配变量名。Windows操作环境中可以导入excel、Lotus、dBase、和Access文件。Unix系统中可以导入dBase文件,并且从SAS9.1开始,Unix系统也可以导入excel和access文件。在windows环境中有一个不需要SAS/ACCESS模块的方法——DynamicData Exchange(DDE),将在2.18中讲解。

Microsoft Excel,Lotus,和dBase文件 下面是用导入过程(IMPORT procedure)读取PC文件的一般过程:

PROC IMPORT DATAFILE=’filename’ OUT=data-setDBMS=identifier REPLACE;

如果读取的文件是如下类型,就不用DBMS=OPTION。

在读取excel时,有时需要指定要读取的是哪一个工作薄——sheet

SHEET=name-of-sheet;

默认情况下,导入过程(IMPORT procedure)会从工作薄的第一行中读取变量名。如果不需要,可以用如下代码使得SAS给变量赋名为F1,F2等。

GETNAMES=NO;

Microsoft Access Files 读取这种文件需要用DATABASE=和DATATABLE=,而不是DATAFILE=option。

下面的是DBMS可以辨认的Access文件

例子有如下的EXCEL数据:

读取的proc import程序:

输出结果如下:

2.18 用DDE读PC文件

DDE,动态数据交换(Dynamic DataExchange),读取PC文件的优点为:可以直接访问存于PC文件中的数据,不要求购买其他SAS产品;缺点为:只能用在windows环境下,只能在程序运行时(比如excel),SAS才能进行读取。

有几种方式可以用DDE访问数据:

  • 复制数据到剪贴板
  • 指定DDE三元组
  • 从SAS中启动PC程序,然后读取数据。

复制数据到剪贴板 可以直接复制数据至剪贴板,然后再SAS程序的DDE FILENAME 语句中是使用CLIPBOARD关键字。比如,excel中有如下的工作薄:

复制A2到G5,然后在不关闭excel的状态下,提交如下SAS程序:

FILENAME语句将指代的文件(BASEBALL)定义成DDE类型,并指定从剪贴板中去读取它(CLIPBOARD)。DDE默认空格为分隔符,如果变量值之间有空格,则要在INFILE语句中用NOTAB选项和DLM=’09’X选项,前者告诉SAS在变量值之间放置制表符,后者告诉SAS将制表符定义为分隔符。如果数据中有缺失值,则要在INFILE中加入DSD和MISSOVER选项,前者将两个连续的分隔符视为缺失值,后者告诉SAS如果此行读完,不要进入下一行给未赋值的变量赋值。

指定DDE三元组 这种方法可以不用复制数据,直接指定出文件的DDE 三元组。DDE 三元组的形式为:application| topic ! item。

有一种方法可以在SAS中直接查看文件的DDE三元组,方法为:复制数据至剪贴板里,触发SAS会话,从解决方案(Solution)菜单中选择附件(accessories)——DDE三元组。一个窗口会出现你复制文件的DDE三元组。比如,一个工作薄的DDE三元组为:

Excel|C:\MyFiles\[BaseBall.xls]sheet1!R2C1:R5C7

读取这个文件的FILENAME语句为:

FILENAME baseballDDE'Excel|C:\MyFiles\[BaseBall.xls]sheet1!R2C1:R5C7';

从SAS中启动程序 这种方法可以不用在运行SAS之前启动数据程序。想要从SAS中启动程序,然后读取数据,则首先需要NOXWAIT和NOXSYNC系统选项,然后使用X语句,一个例子:

NOXSYNC和NOXWAIT语句告诉SAS不要等待用户输入。X语句告诉windows执行或打开引号中路径的文件,注意这里路径设置了两个引号,如果路径中有空格,则要设置两个引号。使用这种方法,必须要在FILENAME语句中指定DDE三元组。

2.19 临时和永久数据集

SAS临时数据集只在目前工作或会话中存在,关闭SAS或结束工作时则删除;永久数据集当关闭SAS或结束工作时仍然存在。

SAS数据集名 所有的SAS数据集都有用句号分开的两层数据集名,如work.a。第一层前缀work是逻辑库名,第二层是在逻辑库中用于辨别自己的成员名。

名字的规则是,以字母或下划线开头,并且名字中只能包含字母、数字和下划线。而且,库名不能超过8个字节,而成员名却可以达到32个字节。

大部分数据集通过数据步创建,过程步也可以创建。如果指定了一个前缀不为work的两层数据集名,则这个数据集就是永久的。如果不指定前缀,则默认数据集是临时的,自动分配到work逻辑库中。下面是一些数据集名,对于的逻辑库,成员名,类型:

临时数据集 如下的程序创建并打印了一个名为DISTANCE的永久数据集:

这里,只指定了成员名distance,自动分配到work库中,日志窗口中有说明:

NOTE:The data set WORK.DISTANCE has 1 observations and 2 variables.

永久数据集 可以在资源管理器窗口中定义一个新库使用:

也可以通过如下程序:

那么日志窗口就会出现如下说明:

NOTE:The data set MYLIB.DISTANCE has 1 observations and 2 variables.

这是一个永久数据集,因为前缀不是work。

2.20 用Libname使用永久数据集

LIBNAME语句的基本形式为:LIBNAMElibref’your-SAS-data-library’;

LIBNAME的后面,需要指定库名和存放的路径,在个人操作环境下LIBNAME语句的基本形式为:

创建永久数据集 如下的例子创建了一个永久SAS数据集,包含了magnolia trees的一些信息。每一种树,原始文件都包含它的科学名、普通名、最大高度、第一次开花的年龄、是evergreen还是deciduous、以及花的颜色。

下面的代码将会创建一个PLANTS的逻辑库,路径为C盘下的MySASLib。然后从原始文件Mag.dat中读取数据,并创建一个名为MAGNOLIA的永久数据集,存在PLANTS库中。

日志窗口会出现如下说明:

NOTE:The data set PLANTS.MAGNOLIA has 5 observations and 6 variables.

如果在电脑中打印文件的地址目录,会发现文件名不是PLANTS.MAGNOLIA。这是因为操作系统有自己对文件命名的方式,这个文件,在Windows,UNIX,和OpenVMS操作环境中名字为magnolia.sas7bdat,在OS/390或者z/OS环境中,文件名就会如LIBNAME语句中定义的data-set-name形式。

读取永久数据集 如果你想打印出上例中创建的数据集,可以用如下语句:

这次LIBNAME语句中的库名为example,但缺失同样路径,逻辑库名可以改变,但成员名MAGNOLIA却一样。输出如下:

2.12 通过直接指代使用永久数据集

可以通过直接指代来使用SAS数据集,且不需要自己定义,SAS为你做好。

直接指代,依据系统不同,使用方法也不同,如下:

可以看到,一些系统的语句中需要指出路径,但如果遗漏了路径,SAS自动使用当前路径,比如这样一个创建名为trees的永久数据集的代码:

DATA ‘trees’;

UNIX和OPENVMS操作环境下,当前的路径默认为启动SAS的路径,可以通过工具(TOOLS)下拉菜单的选项(OPTIOPN)菜单来改变这种默认,windows环境下当前路径会显示在SAS窗口底部。可以通过双击这个路径来改变默认。

例子 如下还是关于magnolia trees的这个例子,

下面的代码将从原始文件mag.dat中读取数据,创建一个名为MAGNOLIA的永久数据集,存放在C盘的Mysaslib路径中:

相应的输出窗口显示如下:

NOTE:The data set c:\MySASLib\magnoliahas 5 observations and 6 variables.

如果打开MySASLib文件夹,会发现一个名为magnolia.sas7bdat的文件。在没指定库的情况下,SAS会自动为你创建一个库,在资源管理器窗口中可以看到,下图是SAS为magnolia创建的库。

用直接指代读取SAS数据集 可以直接用引号+路径的方式读取永久数据集,比如打印magnolia数据集可以:

输出窗口如下:

2.22 列出SAS数据集目录

由于SAS是自文档化,即在自动储存了数据集的信息,因此可以通过contents过程来查看SAS数据集的描述。

Proc contents data=data-set

如果遗漏了data=的语句,SAS自动列出最近创建的数据集

例子如下的程序创建了一个数据集,并且使用proc contents。数据步中使用了label语句,label语句为变量打上标签,并储存在数据集中,在打印时会显示。过程步中也可以使用label,但只在proc contents中有效,不会储存在数据集中。Informat和format可以指定信息和格式,储存在数据集中,也可以在过程步中使用,但不储存在数据集中。

输出如下:

本文分享自微信公众号 - 数说工作室(shushuojun)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏零基础使用Django2.0.1打造在线教育网站

零基础使用Django2.0.1打造在线教育网站(七):数据库字段的定义(上)

努力与运动兼备~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

44460
来自专栏草根专栏

使用 Moq 测试.NET Core 应用 -- Mock 属性

第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html

13740
来自专栏北京马哥教育

做到这二十条,Python程序性能轻松翻倍!

1.优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的...

39570
来自专栏蓝天

使用可重入函数进行更安全的信号处理

在早期的编程中,不可重入性对程序员并不构成威胁;函数不会有并发访问,也没有中断。在很多较老的 C 语言实现中,函数被认为是在单线程进程的环境中运行。

11420
来自专栏青玉伏案

iOS逆向工程之Hopper中的ARM指令

虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学。现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少...

37170
来自专栏JackeyGao的博客

Django小技巧22: 设计一个好的模型

本篇将分享一些技巧,用户改进 Model 的设计。其中有很多与命名约定有关, 这可以大大的提高代码的可读性。

18620
来自专栏Jerry的SAP技术分享

ERP和C4C中的function location

SAP ERP里的Functional Locations,下载到SAP Cloud for Customer后成为类型为‘Functional Locatio...

11520
来自专栏MelonTeam专栏

What's New in LLVM 9

导语 :这绝不仅仅是一篇 WWDC 2017 Session 411 学习笔记。除了有关 LLVM 9.0 的新特性之外,还有关于静态分析器和 Clang 5 ...

372100
来自专栏CDA数据分析师

工具 | 很全的 Python 面试题

Python语言特性 1 Python的函数参数传递 看两个例子: ? 所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。 ...

1.5K90
来自专栏安恒网络空间安全讲武堂

nox&CSAW部分pwn题解

暑假的时候遇到了一群一起学习安全的小伙伴,在他们的诱劝下,开始接触国外的CTF比赛,作为最菜的pwn选手就试着先打两场比赛试试水,结果发现国外比赛真有意思哎嘿。

23630

扫码关注云+社区

领取腾讯云代金券