【快乐自动化】如何用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!")
        })
      }
    
    

Log in to reply