由于 RJDBC 是我唯一可以在Ubuntu上使用的软件包,因此我试图使用它来插入 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文件进行插入,该文件由默认的“选项卡”分隔,并且我正在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”附近看到语法不正确错误吗?
答案 0 :(得分:2)
如果您根据数据创建一条语句该怎么办?像这样:
# 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中任意数量的行
答案 1 :(得分:0)
RJDBC建立在DBI之上,该DBI具有许多有用的功能来执行此类任务。您想要的是dbWriteTable
。语法为:
dbWriteTable(ch, 'cpr_esben.CPR000_Startrecord', df, append = TRUE)
,并将替换您的write.table行。
我对RJDBC并不特别熟悉,但是我认为sendQuery的问题在于您正在SQL语句中引用test.csv
,而该SQL语句未找到使用write.table
创建的文件因为该SQL语句的范围不在您的工作目录中。
答案 2 :(得分:0)
您是否尝试过将文件直接加载到数据库,如下所示。
library(RJDBC)
drv <- JDBC("connections")
conn <- dbConnect(drv,"...")
query = "LOAD DATA INFILE 'test.csv' INTO TABLE test"
dbSendUpdate(conn, query)
您还可以尝试在末尾包含其他语句,例如.txt文件的"|"
和csv文件的","
的列分隔符。