DBI dbWriteTable

sgp667

我真的很喜欢DBI的dbWriteTable函数(我通常使用RSQLite或ROracle作为后端)。

我使用该功能导入许多excel电子表格,问题是,如果这些电子表格是在长期列上创建的,则更改会被添加/删除或将名称从一个文档更改为另一个文档。

因此,我的问题是,有人可以相对快速地将数据添加到数据库中而又不必完全匹配归档列表吗?

这是我使用的示例脚本

require(RSQLite)
require(readxl)

# Create database file
conn <- dbConnect(drv=SQLite(),dbname = "path to database")

# Define import function

excel2sqltable <- function(conn, file, table) {
  source.df <-  read_excel(path=file,col_names = TRUE) %>%
  cbind("SourceFile" = file, .)

  names(source.df) <- source.df %>%
    data.frame(check.names = TRUE) %>%
    {gsub("[.]",x=names(.),replacement="_")}

  print(paste("Importing ", file))

  setOldClass(c("tbl_df", "data.frame"))
  dbWriteTable(conn = conn, name = table, value = source.df, append=TRUE)
}

使用该功能,我可以执行以下操作: sapply(list.files(),FUN = function(x){excel2sqltable(conn,x,"Imports")})

阿卜杜

您可以以此为指导:

library(RSQLite)

sqlite_conn <- dbConnect(drv = SQLite(),dbname = 'data_dump.sqlite')

excel2sqltable <- function(conn, file, table) {
  source.df <-  readxl::read_excel(path=file,col_names = TRUE) %>%
    cbind("SourceFile" = file, .)

  names(source.df) <- source.df %>%
    data.frame(check.names = TRUE) %>%
    {gsub("[.]",x=names(.),replacement="_")}

  if(!dbExistsTable(conn, table)) {
    dbWriteTable(conn = conn, name = table, value = source.df)
  } else {
    # Get both dataframe columns and table columns
    df_cols <- colnames(source.df)
    tbl_cols <- dbListFields(conn, table)

    # Check if there are columns in the dataframe
    # that are not in the destination table
    # Loop through the missing columns and add
    # them to the database table
    if (length(setdiff(df_cols, tbl_cols)) > 0) {
      missing_cols <- setdiff(df_cols, tbl_cols)
      for (col_name in missing_cols) {
        dbSendStatement(conn, sprintf('ALTER TABLE %s ADD %s VARCHAR', table, col_name))
      }
    }

    setOldClass(c("tbl_df", "data.frame"))


    dbWriteTable(conn = conn, name = table, value = source.df, append=TRUE)
  }
}

lapply(list.files(), function(x) {
  excel2sqltable(sqlite_conn, x, "Imports")
})
dbDisconnect(sqlite_conn)

我希望它能达到目的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ROracle-dbWriteTable,日期列

来自分类Dev

RSQLite中的dbWriteTable操作变慢

来自分类Dev

如何解决此错误--dbWriteTable()

来自分类Dev

r-dbWriteTable还是MySQL Delete查询?

来自分类Dev

无法捕获DBI错误

来自分类Dev

MySQL JDBC与Perl DBI

来自分类Dev

DBI抛出哪些异常?

来自分类Dev

MySQL JDBC与Perl DBI

来自分类Dev

无法捕获DBI错误

来自分类Dev

Perl DBI / PostgreSQL min函数

来自分类Dev

为什么不安装DBI?

来自分类Dev

perl DBI执行无法识别“?”

来自分类Dev

使用csvdump = TRUE的MonetDB.R和dbWriteTable发出(bug?)

来自分类Dev

使用ROracle dbWriteTable将POSIXct写回到Oracle DB

来自分类Dev

R-dbWriteTable在列名中使用大写字母

来自分类Dev

How to represent spaces in Perl's DBI properly

来自分类Dev

Perl类别:: dbi-多个连接

来自分类Dev

Perl + DBI +远程MySQL服务器

来自分类Dev

MySQL多重输出和Perl DBI

来自分类Dev

PostgresqlR / DBI说表不存在

来自分类Dev

查找在perl DBI中执行的查询的类型

来自分类Dev

从DBI:Pg selectall_arrayref获取JSON

来自分类Dev

MySQL多重输出和Perl DBI

来自分类Dev

Perl DBI占位符,而不是?s

来自分类Dev

在DBI Perl中清理语句处理程序

来自分类Dev

安装 DBI Perl 模块时出错

来自分类Dev

来自 perl DBI 的 Sybase 警告消息

来自分类Dev

PERL:DBI connect('','system',...)失败:ERROR OCIEnvNlsCreate在使用dbi个人软件包时

来自分类Dev

在@INC 中找不到 DBI.pm(可能需要安装 DBI 模块)