我有多个文件夹,每个文件夹中存储50个不同的csv文件,每个文件都有不同的名称、不同数量的变量和长度。我必须将它们上传到SQL服务器(SSMS),而不是一个接一个地上传它们,我想问如何一次性批量上传它们,特别是它们的唯一名称(即人口统计,生物,网站,实验室,OthLabs,科目等),它们并不大(每个文件夹5mb以下)。我试着创建一个列表csv <- dir(pattern = "csv")
,但还没有弄清楚如何使用它与DBI::dbWriteTable(conn = con, name = , value = , overwrite = FALSE)
。如果过去处理过这个问题的人能帮助我,我将非常感激。
所讨论的表都是不同的,具有不同的尺寸和长度(即(130,12),(151,33),(1,6),(603,16)等),我要做的就是上传他们的名字。我试过下面的代码
alldat <- lapply(csv, read.csv)
for (i in alldat) {
dbWriteTable(conn = con,
name = "i",
value = i,
overwrite = FALSE)
}
是的,它的工作,但将创建只有一个表称为"i",任何建议应该为name =
和value =
的参数是什么,以便循环将继续复制表从R到SQL服务器与表名?
我尝试不成功的其他功能是list2env
,assign
do.call(rbind, i)
与@r2evans一样,我使用DBI而不是dbplyr(我经常将这两个包一起使用)。
下面是我使用的自定义函数的精简版本。你可以在这里找到完整版本。
copy_r_to_sql <- function(db_connection, db, schema, sql_table_name, r_table_name) {
suppressMessages( # mutes translation message
DBI::dbWriteTable(
db_connection,
DBI::Id(
catalog = db,
schema = schema,
table = sql_table_name
),
r_table_name
)
)
}
对于上传多个表,要么循环遍历它们,要么使用apply
。
所以,在最终尝试编写函数和循环之后,这就是我想到的!感谢@ simon s.a。和@r2evans的输入
library(dbi)
# Connect to the SQL Server database
con <- DBI::dbConnect(odbc::odbc(),
driver = "SQL Server",
server = "server_name",
database = "database_name",
uid = "username",
pwd = "password")
# Set the path to the folder containing the CSV files
folder <- "C:/path/to/folder"
#Get a list of the CSV files in the folder
csv_files <- list.files(folder, pattern = "\.csv$")`
#Loop through the CSV files
for (csv_file in csv_files) {
# Read the CSV file into a data frame
df <- read.csv(file.path(folder, csv_file))
# Get the name of the table to import the data into
table_name <- gsub("\.csv$", "", csv_file)
# Import the data into the SQL Server database
dbWriteTable(con, table_name, df)
}