R: Вставить CSV-файл в базу данных, используя RJDBC - PullRequest
0 голосов
/ 02 ноября 2018

Поскольку 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')")

Вставка работает. Затем я пытаюсь сделать INSERT из CSV-файла с теми же данными, которые отделены «вкладкой» по умолчанию, и я работаю над окнами.

# 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' error?

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Что если вы создадите выписку из ваших данных? Что-то вроде:

# 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

0 голосов
/ 14 мая 2019

Вы пытались загрузить файл непосредственно в базу данных, как показано ниже.

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

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

Вы также можете попробовать включить в конец другие операторы, такие как разделитель для столбца, например "|" для файла .txt и "," для файла CSV.

0 голосов
/ 05 ноября 2018

RJDBC построен на DBI, который имеет много полезных функций для выполнения подобных задач. То, что вы хотите, это dbWriteTable. Синтаксис будет:

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

и заменит вашу строку write.table.

Я не очень хорошо знаком с RJDBC, но думаю, что проблема с вашим sendQuery заключается в том, что вы ссылаетесь на test.csv внутри своего оператора SQL, который не находит файл, созданный вами с write.table, как область действия этот оператор SQL не находится в вашем рабочем каталоге.

...