R-同一路经下批量Excel合并与写入Oracle的笔记

常见的读取的文件的函数有read.tabel(),scan(),readlinds()等,但是在目前的用的R version 3.3.1环境下即便使用odbcConnectexcel()方法读取Excel时常遇到一些问题,比如提示报错文件无法识别结束(最后一行,要空行)或当下环境包不支持2007版Excel等问题,遂整理使用的readxl包的使用经历便于日后查找方法:

1、首先一写很好的学习链接,分别是:

(1)https://github.com/hadley/readxl  (2)https://suensummit.github.io/RCourseBankSinoPac/week2handouts.html(3)http://blog.qiubio.com:8080/archives/3965

这三篇内容只要实现自己实践的只要参考来源,非常实用。

######################################################################################################################

附实践脚本:

#2016年8月19日联通语音通信数据明细脚本2

library(RODBC)#载入包,为处理后数据导入Oracle所用

conn<-odbcConnect(“DSN”,”USERID”,”PASSWORD”) #将双引号内容换成自己的Oracle信息,其中dsn可以是在数据源管理器中的自定义名称

library(readxl)#
reviewpath<-“C:/Users/****/Downloads/phone”      #Excel系列文件存放的文件夹路径
completepath <- list.files(reviewpath, pattern = “*语音通信.xls$”,full.names = TRUE)    #{*语音通信.xls$}构造目标类型Excel的名称后缀特征,list.files()读取reviewpath下符合条件的所有文件
#cv<-read_excel(x,sheet = 1,col_names=F,skip = 1)#读取数据值的测试条件,skip参数跳过第1行列名
#names.files<-dir() #获取所有EXCEL数据的文件名

migrant.2016<-NULL;###构造空对象为读入的数据对象最终合并做好准备,这是非常关键的一步;

for (i in 1:length(completepath)){                ##for循环中i in 1:length(completepath)也是非常重要的一个内容
migrant<-read_excel(completepath[i],sheet=1,col_names=F,skip = 1)  ##实际读入数据的参数设置
migrant.2016<-rbind(migrant.2016,migrant)  #合并数据
}

##/**** 序号, 业务类型, 通话起始时间 ,通话时长 ,呼叫类型 ,对方号码, 通话地点, 通话类型 ,通话费 ,其他费, 小计***/
names(migrant.2016)<-c(‘seqnum’,’bs_type’,’com_strtime’,’com_time’,’call_type’,’revers_phone’,’com_location’,’com_type’,’com_fee’,’other_fee’,’total_fee’) ##因为skip跳过了列名称,重新命名
migrant.2016<-migrant.2016[,-1]     ##删除序列号字段
voice_com<-as.data.frame.data.frame(migrant.2016)  ### 因为rendxl()构造的数据不是单纯的data.frame,而导入Oracle should be a data frame的强制要求,所以做转化

#写入oracle时colname建表时已有列名,所以option设置为false;并且tablename=” “最好赋值一个表名,而不是默认null,以免提示无效或参数设置不合适
sqlSave(conn,voice_com,tablename=’voice_com’,append=TRUE,rownames=FALSE,colnames=FALSE,verbose =TRUE,safer=FALSE,addPK =FALSE)

——————————————————————————————————————————————————————————————————————————————————————————-

PS:

1、Oracle11g的sql语法跟老版本有些不同,sql中表名和字段都要用双引号括住,尤其是R中使用sqlquery必须注意双引号的转义写法,比如:

hg<-sqlQuery(conn,”select * from \”migrant_201603\””)

2、使用navicat for oracle 客户端可以免敲双引号的累赘,附navicat连接Oracle的常见问题与解决http://tech.huweishen.com/gongju/1154.html,因为本次连接中报“ORA-12737 set CHS16GBK”错误,亲测可用。

###################################################################################################

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s