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

R: Insert csv-file into database using 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,默认情况下 "tab" 分隔,我正在处理 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 文件时做错了什么有什么建议吗?我没有收到 Incorrect syntax near the keyword 'FROM' error?

RJDBC 是建立在 DBI 之上的,它有很多有用的功能来完成这样的任务。你要的是dbWriteTable。语法为:

dbWriteTable(ch, 'cpr_esben.CPR000_Startrecord', df, append = TRUE)

并会替换您的 write.table 行。

我不是特别熟悉 RJDBC,但我认为您的 sendQuery 的问题是您在 SQL 语句中引用了 test.csv,它没有找到您创建的文件write.table 作为 SQL 语句的范围不在您的工作目录中。

如果您从您的数据创建一个语句会怎样?类似于:

# 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 中任意数量的行

您是否尝试过将文件直接加载到数据库中,如下所示。

library(RJDBC)
drv <- JDBC("connections")      
conn <- dbConnect(drv,"...")

query = "LOAD DATA INFILE 'test.csv' INTO TABLE test"
dbSendUpdate(conn, query)

您也可以尝试在末尾包含其他语句,例如列的分隔符,例如 "|" 用于 .txt 文件,"," 用于 csv 文件。