转自:http://blog.sina.com.cn/greatdoor(数据元素) 生活中,我们常常因为这样或那样的事情而需要从一个城市到另外一个城市。旅途前,我们需要考虑旅途中的各个环节,比如说确定旅行方式(水、陆、空的选择),交通工具的选择及出行站点、出行车次(航班)等等。而把各种形式的数据按照自己的要求转换为SPSS格式数据,就好比我们从一个城市到另一个城市,而SPSS格式的数据就是我们的目的地。 和现实生活一样,利用Syntax将各种形式的数据转换为我们所需的SPSS格式数据也需要我们像旅途一样考虑一些细节问题。例如:我们从一个数据库文档中读取我们所需的数据,首先确定SPSS与数据库间采用何种连接方式(ODBC或JDBC),然后确定采集的数据来自何种数据库(Oracle,DB2,SQL SERVER,ACCESS等),接下来就是确定类似出发站点、车次等一系列细节问题。这样说来好像有点玄乎,下面将结合实例,看Syntax是如何一步一步的从数据库、EXCEL、TXT等格式文档中提取数据。 一、从数据库中读取数据 由于从数据库中读取数据需要输入的代码比较繁琐,一般来说先利用菜单向导操作,在结束前利用Paste将操作大致代码导入Syntax编辑窗口中,然后再根据自己的需要对代码做适当的修改。例如: GET DATA ***告诉SPSS你此行的目的,得到数据***. /TYPE=ODBC ***接下来就是选择海陆空了,omgd!是ODBC****. /CONNECT= ***交通工具的选择及细节,利用交通工具将两地连起来就有了CONNECT***. 'DSN=Microsoft Access;DBQ=c:\mydocuments\dm_demo.mdb;'+ (通常这些细节都利用向导直接生成) ' DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;' /SQL = 'SELECT * FROM CombinedTable'. ***上面安置完毕,到达目的地了,/SQL就好比你到目的地后所做之事***. EXECUTE. 上面Syntax的作用是将ACCESS数据库中CombinedTable表中所有数据导入SPSS,上面Syntax语句中红色标注的可以说是此语句的核心部分,①、/connect子语句说明从何种数据库从提取数据及提取相关细节,此过程通常由向导生成,一般需要用时复制-粘贴即可;②、/SQL子语句相比/CONNECT语句则是重中之重,也是此次旅途的终极目的。如果从2个不同的表中选取变量,则是 /SQL = 'SELECT * FROM [table1],[table2]' ' WHERE [conditions]'. 还有select与group by,order by,having 等语句联合运用的情况,更多SQL语法知识则需参考数据库相关书籍(这也是目前许多公司要求做数据分析的懂数据库的原因之一)。 注:单纯从数据库中提取数据并不需要太多数据库知识,单纯了解SQL查询语言就可以了,个人建议读读《SQL循序渐进》。 二、从EXCEL格式文件中读取数据 利用Syntax语句从EXCEL中读取数据并没有太多的技巧,数据读取过程可以简单的分为2类,一类是读取单表数据,另一类则是读取多表数据(与从数据库中读取数据语法类似,只是/CONNECT语句稍有不同)。首先简单的说说第一类从单表中读取数据,例如:从我的文档中读取名叫data的EXCEL工作薄中表salary的[A3:H160]的数据,且将读取数据的第一行作为变量名,其Syntax代码如下: get data ***①告诉SPSS,你的目的—得到数据(get data)***. /type=xls ***②读的数据是什么类型(XLS OR XLSM<EXCEL2007>)***. /file="C:/mydocuments/data.xls". ***③告诉SPSS文档的位置***. /sheet=name 'salary' ***④告诉SPSS你要读取那个表(缺失时自动读取第一个表)***. /cellrange=range 'A3:H160' ***⑤告诉SPSS你要读取表中那些数据***. /readnames=on. ***⑥将读取数据的第一行设置为变量名***. 上面语法明确的表达你的意图,再联系我们在旅途中的种种行为,这个语句就轻而易举的被攻克了。值得一提的是,上面语句中的④⑤⑥三个子语句都可省略,省略后SPSS将从工作薄中第一个表读取所有数据,并将第一行默认为变量名,如果第一行为空,变量名则默认为VAR1,VAR2……,这一过程和利用菜单向导操作效果一样,下面说说怎样从多个表中读取数据,例如: GET DATA /TYPE=ODBC /CONNECT= 'DSN=Excel Files;DBQ=c:\examples\data\sales.xls;' + 'DriverId=790;MaxBufferSize=2048;PageTimeout=5;' /SQL = 'SELECT Location$.[Store Number], State, Region, City,' ' Power, Hand, Accessories,' ' Tires, Batteries, Gizmos, Dohickeys' ' FROM [Location$], [Tools$], [Auto$]' ' WHERE [Tools$].[Store Number]=[Location$].[Store Number]' ' AND [Auto$].[Store Number]=[Location$].[Store Number]'. 上面的代码和从数据库中读取表数据完全一样,只是在/CONNECT语句上做了些许变化,其他的并无区别,当然重点还是后面的提取数据变量语句/SQL,这里要说明的是如果提取变量字符中含有空格的话就需要用[ ]给框起来了,正如上面示例代码所示。 另外,不得不提的是从多表中读取数据较从单表中读取数据的一些局限性,比如不能像单表一样随意选择数据读取范围;读取表中的第一行非空字符都将强制读取为SPSS中的变量;变量类型较单一,只提供了数字和字符两种数据类型等等。 三、从TXT格式文件中读取数据 利用向导从TXT格式文件从读取数据有时候会因数据格式整洁而很方便,有时又会因为格式混乱而使你后面的分析工作变的麻烦,而利用代码则可以一次解决这种问题。通常读取文本格式数据语句分为get data和data list两种,采用何种语句完全凭个人喜好,当然两种方式各有所长,比如CSV文件或是很大的容量的文本数据用get data较data list就方便的多,而在处理程序内数据(begin data……end data)或结构相对较复杂的数据时用data list语句则较get data语句更方便些。根据文本数据格式,data list语句又有data list free/list/fixed之分,这里不便一一道来,通常一般的TXT格式的数据我们很少遇到,这里主要说说从网站数据库中导出的CSV格式的数据转换情况,例如,我们从网站中导出如下CSV格式的数据dara.csv: ID,Name,Gender,Date Hired,Department 1,"Foster, Chantal",f,10/29/1998,1 2,"Healy, Jonathan",m,3/1/1992,3 3,"Walter, Wendy",f,1/23/1995,2 4,"Oliver, Kendall",f,10/28/2003,2 下面我们将像旅途一样将此csv格式的数据转换为我们所需的.sav格式, get data ***①告诉SPSS,你的目的***. /type=txt ***②告诉SPSS你要乘车还是坐船***. /file='c:/mydocuments/data.csv' ***③找到车站码头***. /delimiters= "," ***④司机强调路上安全(数据用","分隔)***. /qualifier='" ' ***⑤司机介绍如何处理突发事故(比如数据中包含空格,逗号等特殊情况)***. /arrangement=delimited ***⑥其他注意情况(限制情况)***. /firstcase=2 ***⑦找到自己的座位(从第2行开始读取数据)***. /variables= ID F3 Name A15 Gender A1 Date_Hired ADATE10 Department F1. ***⑧到了目的地确定适宜(设定变量名及格式)***. 此次Syntax旅途暂告一段落,当然还有许多其他格式的数据,这里不一一列举,但通常都可以像旅途一样实行转换目的。
|