从MS Access数据库导入的大数据集,然后按日期对数据进行子集并将其导出到SQL数据库。
通过sqlsave命令导出可以正常工作,但是由于数据集的大小(超过500,000行,包含73个变量),因此不合适。
尝试使用odbc写入数据会产生以下错误:nchar(as.character(x))中的错误:无效的多字节字符串,元素62220
通过使用Google和浏览Stackoverflow,我发现此错误通常与数据中的非标准字符有关。
在尝试将表写入SQL之前,我已经使用dplyr删除了所有非标准字符,同样的错误。
然后我尝试使用UTF-8编码将文件导出到csv,并在尝试将表写入SQL之前,使用UTF-8编码将其恢复,同样的错误。
最后,我尝试了一种指定最大列长度以及格式化为varchar(255),float或date的每列结构的方法。同样的错误。
library(odbc)
library(RODBC)
library(DBI)
library(data.table)
setwd("E:/BUS_INSIGHTS/David r scripts/PUNE_Claims")
odbcCEDBS0233 <- dbConnect(odbc::odbc(), dsn = "CEDBS0233")
CEDBS0233 = odbcConnect("CEDBS0233")
PUNE <- dbConnect(drv = odbc::odbc(), .connection_string = "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; Dbq=E:/Motor/Data/ZC Combined/2018/1812/ZC Combined Pune.accdb")
PUNE <- subset(PUNE, DATE_OF_LOSS > as.Date("2009-01-01"))
require(dplyr)
clean <- PUNE %>%
mutate_all(funs(gsub("[[:punct:]]", "", .)))
DBI::dbWriteTable(con = odbcCEDBS0233,
name = SQL('PUNE_Claims'),
value = clean,
overwrite=TRUE,)
我尝试了各种其他方法,例如直接将csv写入SQL(很遗憾,我们的SQL Server不允许这样做)。使用正则表达式和其他我现在忘记的东西。
这里已经完全撞墙了,我不知道为什么sqlsave会愉快地上传数据,而odbc却拒绝了。
我找不到如何定位元素62220来找出问题所在,但是使用dplyr清除所有不良字符应该没有问题。
我在您的手中,任何帮助将不胜感激。
答案 0 :(得分:0)
如果您知道引起此问题的列,则可以继续进行
x <- iconv(x,"WINDOWS-1252","UTF-8")
否则,只需对每列进行循环,即可将其转换为UFT-8
df[,sapply(df,is.character)] <- sapply(
df[,sapply(df,is.character)],
iconv,"WINDOWS-1252","UTF-8")
这应该可以解决问题。