DBI::dbWriteTable,无效的多字节字符串
Posted
技术标签:
【中文标题】DBI::dbWriteTable,无效的多字节字符串【英文标题】:DBI::dbWriteTable, invalid multibyte string 【发布时间】:2019-02-11 14:45:05 【问题描述】:从 MS Access 数据库导入的大型数据集,然后按日期对数据进行子集化并导出到 SQL 数据库。
通过 sqlsave 命令导出效果很好,但是由于数据集的大小(超过 500,000 行,包含 73 个变量),它不适合。
尝试使用 odbc 写入数据会产生以下错误:nchar(as.character(x)) 中的错误:无效的多字节字符串,元素 62220
通过使用 google 和浏览 ***,我发现此错误通常与数据中的非标准字符有关。
在尝试将表写入 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完全拒绝。
我找不到如何定位元素 62220 以查看问题所在,但使用 dplyr 清除任何坏字符应该没有问题。
我在你的手中,任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:如果你知道是哪一列导致了这个问题,你可以去关注
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")
这应该可以解决问题。
【讨论】:
以上是关于DBI::dbWriteTable,无效的多字节字符串的主要内容,如果未能解决你的问题,请参考以下文章
pdf-writer-1.1.8/lib/pdf/writer.rb:712:无效的多字节字符(US-ASCII)
国际化时django.po中的msgstr =“”为中文时,django-admin.py compilemessages 出错:无效的多字节序列