DBI :: dbWriteTable,无效的多字节字符串

问题描述 投票:0回答:1

从MS Access数据库导入的大型数据集,数据按日期进行子集化并导出到SQL数据库。

通过sqlsave命令导出工作正常,但由于数据集的大小(超过500,000行,73个变量),它不适合。

尝试使用odbc写入数据会生成以下错误:nchar中的错误(as.character(x)):无效的多字节字符串,元素62220

从使用谷歌和浏览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服务器不允许这样做)。使用正则表达式,以及我现在忘记的其他事情。

在这里完全碰到了一堵砖墙,我不知道为什么sqlsave乐意上传数据并且odbc flat out拒绝。

我找不到如何定位元素62220以查看错误,但使用dplyr清除任何不良字符应该没有问题。

我在你的手中,任何帮助将不胜感激。

sql encoding odbc dbi
1个回答
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")

这应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.