【快乐自动化】如何用R连接数据库并批量导入数据
-
想要批量导入数据到数据库,试验了SQL Server的Bulk Insert,觉得没有那么好用,于是就转向了R。
分成三步。
第一步:批量读入数据,存储为Data.Frame格式
第二步:连接数据库
第三步:写入数据库
-
第一步:批量读入数据,存储为Data.Frame格式
借鉴了下面帖子里面的做法
https://stackoverflow.com/questions/9564489/read-all-files-in-a-folder-and-apply-a-function-to-each-data-framepath = "my path" #这里替换成自己的路径 LenPath = nchar(path) filenames <- list.files(path , pattern="*.csv", full.names=TRUE) ldf <- lapply(filenames, read.csv) res <- lapply(ldf, summary) names(res) <- substr(filenames,LenPath+2, LenPath + 30) #这里要根据自己的文件名改变长度
如果是txt文件,可以用下面的代码
path = "my path" #这里替换成自己的路径 LenPath = nchar(path) filenames <- list.files(path , pattern="*.txt", full.names=TRUE) ldf <- lapply(filenames, read.delim) res <- lapply(ldf, summary) names(res) <- substr(filenames,LenPath+2, LenPath + 30) #这里要根据自己的文件名改变长度
-
第二步:连接数据库
这里用了DBI和odbc包。验证方式是"Windows Authentication",也就是用系统的用户信息来登录数据库。
library(DBI) library(odbc) con <- dbConnect(odbc::odbc(), Driver = "SQL Server", Server = "my server name", #这里替换成自己的Server名字 Database = "DataBase", #这里替换成自己的DataBase名字 Trusted_Connection = "True")
-
第三步:写入数据库,这里用了tryCatch来让程序不会在产生Error的情况下停止
for(i in 1:length(ldf)){ tryCatch( data <-dbWriteTable(con, names(res)[i], data.frame(ldf[i])) , error = function(e){ message("An error occurred:\n", e) }, warning = function(w){ message("A warning occured:\n", w) }, finally = { message("Finally done!") }) }
-
在操作到第三步的时候,我这边报了一个错,报错信息:
An error occurred:
Error: Cannot pass NA to dbQuoteIdentifier()
Finally done!
An error occurred:
Error in dbExistsTable(conn, name): 不是所有的length(name) == 1都是TRUEcode如下:
> path = "D:\\GroupP" #这里替换成自己的路径 > LenPath = nchar(path) > filenames <- list.files(path , pattern="*.csv", full.names=TRUE) > ldf <- lapply(filenames, read.csv) > res <- lapply(ldf, summary) > names(res) <- substr(filenames,LenPath+1, LenPath + 3) #这里要根据自己的文件名改变长度 > library(DBI) > library(odbc) > con <- dbConnect(odbc::odbc(), Driver = "SQL Server", Server = "shenjing", #这里替换成自己的Server名字 Database = "Group_Bussiness", #这里替换成自己的DataBase名字 Trusted_Connection = "True") > for(i in 1:length(ldf)){ tryCatch( data <-dbWriteTable(con, names(res)[i], data.frame(ldf[i])) , error = function(e){ message("An error occurred:\n", e) }, warning = function(w){ message("A warning occured:\n", w) }, finally = { message("Finally done!") }) }
基础数据路径和文件名如下:
-
lapply用得很精髓,我之前都是loop哈哈哈
-
@bengbengbeng 这个目前Close掉了,问题主要是1. 程序不能识别大写的CSV后缀,2. 路径的/要换成\或//
但是目前还有一个问题就是R运行起来时大的Data File似乎会遇到内存不足的问题。还没有解决方案。