1.在初接触到sas的时候,就产生了安装方面的问题。公司关联的数据库是Oracle的数据库,提供的机器是win7 旗舰版64位系统,Oracle的版本也是64位,但PLSQL 是32位,这就导致了在安装过程中遇到种种由于系统位数不匹配的问题(个人认为是如此,并且到目前也没找到比较合理的解决办法)。
下面的附件提供了SAS9.3多语言的安装包的地址和安装教程,以及sid更新的问题。
/*如果有google无法访问的问题,请自行到百度贴吧-chrome吧搜索解决办法。*/
http://www.zhiyanblog.com/sas-9-3-download-crack.html
2.SAS链接Oracle数据库,可以通过Oracle引擎的方式,或者通过ODBC去连接,这个可以参考以下几个帖子。此处应该注意的是如果想要做成永久库,必须要选择“启动时候启动”,另外路径就是你储存所有你的库中的工作表的位置,我开始傻乎乎的放到了桌面,可想而知我多郁闷了。
方法一:通过ODBC链接
http://wenku.baidu.com/link?url=0S8uPkxN_yaZhJHuFlpij7jHmoN16VGDi2An7j3xxd3fBsLe1cAnfNprFdVXSgQBXcSDDYAzmR_XSBpPvhUsvDf96RR96IekjkwFgjnNrwO
方法二:通过Oracle引擎链接
http://blog.sina.com.cn/s/blog_5fc375650100gkoj.html
另附上SAS与各种数据库关联的代码,如下:
http://biancheng.dnbcw.info/oracle/301500.html
- *******************************************************************
- 功能:链接Sql Server数据库
- 参数说明:
- libname (在SaS映射的数据库名) Data Source (SQL Server主机地址)
- Initial Catalog (SQL Server数据库名)
- User ID (SQL Server数据库登陆用户名) Password (SQL Server数据库登陆密码)
- *******************************************************************/
- /* 连接 DataBaseName 数据库 */
- libname base oledb provider=sqloledb
- properties=("Data Source"=ServerName "User ID"=MyUserName "Password"=MyPassWord "Initial Catalog"=DataBaseName);
- /*******************************************************************
- 功能:链接Oralce数据库
- 参数说明:
- libname (在SaS映射的数据库名) path (Oracle数据库SID)
- schema (Oralce数据库名一般为数据库一个用户)
- oracle user (oracle数据库登陆用户名) password (oracle数据库登陆密码)
- 注意:登陆Oracle数据库的帐号密码必须有权限登陆指定的数据库
- *******************************************************************/
- /* 链接 DataBaseName 数据库(SID:orcl) */
- libname DataBaseName oracle user=MyUserName password=MyPassWord path='orcl' schema=DataBaseName;
- /*******************************************************************
- 功能:链接dbf数据文件
- 参数说明:
- filename (指定需要打开的dbf文件)
- db5 (2,3,4,5 指定dBASE的版本)
- out (在SaS中的记录集)
- *******************************************************************/
- filename DataBaseName '盘符:\路径\文件名.DBF';
- proc dbf db5=DataBaseName out=DataBaseName;
- run;
- /*******************************************************************
- 功能:导入excel数据文件
- 参数说明:
- OUT(输出的Sas数据集)
- DATAFILE(指定导入的excel文件)
- RANGE(指定导入的sheet名称)
- GETNAMES(首行标题)
- *******************************************************************/
- PROC IMPORT OUT= WORK.DataBaseName
- DATAFILE= "盘符:\路径\文件名.xls"
- DBMS=EXCEL2000 REPLACE;
- RANGE="Sheet1$";
- GETNAMES=YES;
- RUN;
- /*******************************************************************
- 功能:导入access数据文件
- 参数说明:
- OUT(输出的Sas数据集)
- DATAFILE(指定导入的access数据表)
- DATABASE(access数据库文件)
- *******************************************************************/
- PROC IMPORT OUT= WORK.TableName
- DATATABLE= "TableName"
- DBMS=ACCESS2000 REPLACE;
- DATABASE="盘符:\路径\文件名.mdb";
- RUN;
3.导入CSV格式的文件的时候,产生了一个很奇怪的问题。
第一:关于数据格式的转换。在SAS读取文件的时候会自动根据数据内容选择是否对数据类型进行转换,其中最让我头疼的就是日期格式的转换,这个稍后再提。
第二:部分字符的长度会超过限制,这种情况下我会采用两种办法,一是观察长度,用下面提到的modify来更改长度;二是通过去掉空格等无效字符的函数,如trim等(有听到人讲过会有leading space/zero这种函数,但是还没找到相关的用法,后续进行更改和补充)
第三:不知为何,CSV格式文件的最后一列偶尔会无法导入,为了验证是否数据本身问题,我将数据库中的最后一列移动到前面的位置,发现可以导入,但是移动后的最后一列又无法导入,这个问题到现在我依然无法理解。
4.链接数据库之后发现由于权限限制问题,不允许对初始表做很多很多的操作,并且处于对数据的保护,我会在对每个表操作前,复制所有的信息到一个新表中,这里采取了proc sql语句
- proc sql;
- create table mytable as
- select *
- from work.dataset
- order by id;
- quit;
这里加入了order by是方便操作,因为后面的数据处理中,还会有一些需要排序的操作,但是如果没有加入也不要紧,可以通过proc sort来实现
- proc sort data=work.dataset;
- by id;
- run;
5.导入一个excel工作薄中所有工作表的小技巧-查自论坛
- libname xlsfiles excel 'C:\... .xls';
- proc contents
- data=xlsfile._all_;
- run;
如果想导入的文件是.xlsx的话,就直接吧.xls改成.xlsx即可
6.给数据加标签-format的用法之一
- /*step 1用value语句在proc format中创建标签格式,完成后,在work库中会产生一个format的文件*/
- proc format;
- value sex1
- 1='male'
- 2='female'
- run;
- /*如果次数的变量是字符变量,要在前面上上$*/
- /*step 2把创建的标签格式用format语句赋值给相应的变量,该format语句可以用在proc 或者data中*/
- proc freq data=work.dataset;
- fromat sex sex1.;
- run;
- /*这里sex1.的那个‘.’不可以省略*/
7.更改变量的长度。此处采用的是sql语句中的modify来实现
- proc sql;
- alter table work.dataset;
- modify var1 char(1);
- quit;
8.更改变量类型
在SAS中只有字符型和数字型(包括时间)两种类型,因此对应于一些变量,比如时间类型的变量就需要一些转化。
其中我对于时间类型的数据真的是特别头疼。也希望会找到更加有效的办法来解决。说一下我遇到的情况。
第一:原始数据是'2014-12-14'这种类型,但是读取后变成数字类型的data16.,如'14DEC14 00:00:00'。经过我的观察,这种类型的数据的长度有的是8,有的是10。可以用datapart('14DEC14 00:00:00')提取date的部分(提取时间部分就是timepart),但是提取后,有可能会变成一串数字,这时候可以查看长度,是否不正确,然后在利用format mmddyy10.等来转换。
第二:遇到直接将原始数据'2014-12-14'变成字符型的'2014-12-14',这种情况,可以通过substr的方式提取或者通过put来转换
substr的方式


雷达卡



京公网安备 11010802022788号







