R:使用 RJDBC 将 csv 文件插入数据库

标签 r insert bulkinsert rjdbc

由于RJDBC是我能够在Ubuntu上工作的唯一软件包,我尝试使用它来INSERT一个CSV文件进入数据库。

我可以做以下工作:

# Connecting to database
library(RJDBC)
drv <- JDBC('com.microsoft.sqlserver.jdbc.SQLServerDriver', 'drivers/sqljdbc42.jar', identifier.quote="'")
connection_string <- "jdbc:sqlserver://blablaserver;databaseName=testdatabase"
ch <- dbConnect(drv, connection_string, "username", "password")

# Inserting a row
dbSendQuery(ch, "INSERT INTO cpr_esben.CPR000_Startrecord (SORTFELT_10,OPGAVENR,PRODDTO,PRODDTOFORRIG,opretdato) VALUES ('TEST', 123, '2012-01-01', '2012-01-01', '2012-01-01')")

插入有效。接下来,我尝试使用相同的数据创建一个 CSV 文件的INSERT,该文件由默认的“选项卡”分隔,并且我正在 Windows 上工作。

# Creating csv
df <- data.frame(matrix(c('TEST', 123, '2012-01-01', '2012-01-01', '2012-01-01'), nrow = 1), stringsAsFactors = F)
colnames(df) <- c("SORTFELT_10","OPGAVENR","PRODDTO","PRODDTOFORRIG","opretdato")
class(df$SORTFELT_10) <- "character"
class(df$OPGAVENR) <- "character"
class(df$PRODDTO) <- "character"
class(df$PRODDTOFORRIG) <- "character"
class(df$opretdato) <- "character"
write.table(df, file = "test.csv", col.names = FALSE, quote = FALSE)

# Inserting CSV to database
dbSendQuery(ch, "INSERT cpr_esben.CPR000_Startrecord FROM 'test.csv'")

Unable to retrieve JDBC result set for INSERT cpr_esben.CPR000_Startrecord FROM 'test.csv' (Incorrect syntax near the keyword 'FROM'.)

当我尝试插入 csv 文件时,您对我做错了什么有什么建议吗?我没有收到关键字“FROM”附近的语法错误错误?

最佳答案

如果您根据数据创建报表会怎样?像这样的东西:

# Data from your example
df <- data.frame(matrix(c('TEST', 123, '2012-01-01', '2012-01-01', '2012-01-01'), nrow = 1), stringsAsFactors = F)
colnames(df) <- c("SORTFELT_10","OPGAVENR","PRODDTO","PRODDTOFORRIG","opretdato")
class(df$SORTFELT_10) <- "character"
class(df$OPGAVENR) <- "character"
class(df$PRODDTO) <- "character"
class(df$PRODDTOFORRIG) <- "character"
class(df$opretdato) <- "character"

# Formatting rows to insert into SQL statement
rows <- apply(df, 1, function(x){paste0('"', x, '"', collapse = ', ')})
rows <- paste0('(', rows, ')')

# SQL statement
statement <- paste0(
  "INSERT INTO cpr_esben.CPR000_Startrecord (", 
  paste0(colnames(df), collapse = ', '), 
  ')',
  ' VALUES ',
  paste0(rows, collapse = ', ')
)

dbSendQuery(ch, statement)

这应该适用于 df 中的任意数量的行

关于R:使用 RJDBC 将 csv 文件插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53117941/

相关文章:

c - insertAtTail 未在链表中添加节点

c++ - 如何将自定义对象插入到 std::map 中?

java - 从 Java 批量复制到 SQL Server 的最有效方法是什么?

c# - 跨多个相关表进行批量插入?

python - 如何使用批量插入将数据从 Dataframe 插入 SQL Server 表?

r - 使用 R 根据逻辑条件和它们发生的时间接近程度来识别和分组相关观察

r - 我们如何将来自两个不同线性模型的预测变量合二为一?

r - 如何在R中重构矩阵?

r - as.tibble()、as_data_frame() 和 tbl_df() 之间有什么区别?

vb.net - 如何使用Dapper和sqlite插入语句保存字节数组