R中SQL Server数据UTF-8转换后write.xlsx仅写入最后一行的解决方法
解决SQL Server数据拉取后的编码转换与数据框结构保留问题
问题场景
从SQL Server拉取数据到R数据框时遇到编码错误:
Error in stri_length(newStrs) : invalid UTF-8 byte sequence detected; try calling stri_enc_toutf8()
使用sapply(data, iconv, to = "UTF-8")转码后,数据结构变为矩阵,导致openxlsx::write.xlsx()写入Excel时仅保留最后一条记录。
解决方案
方法1:用lapply转码后还原数据框结构
sapply会自动简化结果为矩阵,改用lapply返回列表,再转换为数据框,同时跳过非字符列避免无效转码:
# 对数据框的字符列进行编码转换,保留数据框结构 data <- as.data.frame(lapply(data, function(col) { if (is.character(col)) { iconv(col, to = "UTF-8") } else { col } }), stringsAsFactors = FALSE)
方法2:连接数据库时直接指定编码(从源头避免问题)
使用odbc包建立连接时,通过encoding参数指定UTF-8,拉取的数据直接是正确编码的data.frame:
library(DBI) library(odbc) # 建立带编码指定的数据库连接 con <- dbConnect(odbc(), Driver = "SQL Server", Server = "你的服务器地址", Database = "你的数据库名", UID = "用户名", PWD = "密码", encoding = "UTF-8") # 拉取数据 data <- dbGetQuery(con, "SELECT * FROM 目标表名") dbDisconnect(con)
方法3:用dplyr简洁处理字符列
借助dplyr的mutate_if,仅对字符列执行转码,自动保留数据框结构:
library(dplyr) data <- data %>% mutate_if(is.character, ~iconv(., to = "UTF-8"))
验证与写入
转码完成后,通过class(data)确认结构为data.frame,再执行写入:
library(openxlsx) write.xlsx(x = data, file = "输出文件.xlsx")
内容的提问来源于stack exchange,提问作者tbaker818
相关产品推荐
相关产品推荐

