【快乐自动化】如何用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-frame

    path = "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都是TRUE

    code如下:

    > 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!")
             })
     }
    

    基础数据路径和文件名如下:
    微信截图_20220523112358.png



  • lapply用得很精髓,我之前都是loop哈哈哈



  • @bengbengbeng 这个目前Close掉了,问题主要是1. 程序不能识别大写的CSV后缀,2. 路径的/要换成\或//

    但是目前还有一个问题就是R运行起来时大的Data File似乎会遇到内存不足的问题。还没有解决方案。


登录后回复