Windows环境下read_csv_arrow处理扩展拉丁字符遇阻求助
解决R中arrow包读取含特殊字符CSV的编码问题
问题背景
Windows系统下有如下CSV文件:
name, age Siân, 34 Brónagh, 45 François, 87 Alan, 23 ,
使用arrow包读取:
library(arrow) df <- read_csv_arrow("people.csv")
文件加载成功,但name列被识别为arrow_binary类型,尝试转换时遇到多个问题:
- 直接执行
as.character(df$name)报错:Can't convertx<arrow_binary> to <character>. - 调用
arrow::cast提示函数不存在:! 'cast' is not an exported object from 'namespace:arrow' - 读取时指定
col_types = schema(name = arrow::string())报错:! Invalid: In CSV column #1: Row #1: CSV conversion error to string: invalid UTF8 data - 期望用UTF-16编码读取,但不确定arrow是否支持该类型。
解决方案
1. 读取阶段指定正确编码(优先方案)
Windows下的CSV文件常使用GBK/GB2312或UTF-16 LE编码,而非默认的UTF-8。读取时直接指定文件编码,让arrow正确识别字符串:
情况1:文件为GBK/GB2312编码
df <- read_csv_arrow("people.csv", encoding = "GBK")
情况2:文件为UTF-16 LE编码
arrow支持UTF-16编码,需明确指定编码类型:
df <- read_csv_arrow("people.csv", encoding = "UTF-16LE")
指定编码后,name列会直接被识别为string类型,无需后续转换。
2. 已读取为arrow_binary类型的转换方案
如果已经将列读成了arrow_binary,可以通过rawToChar逐个转换raw向量为字符:
# 用purrr处理列表型的arrow_binary列 library(purrr) df$name <- map_chr(df$name, function(x) if(is.null(x)) NA else rawToChar(x)) # 或用base R的sapply实现 df$name <- sapply(df$name, function(x) if(is.null(x)) NA_character_ else rawToChar(x))
3. 解决arrow::cast找不到的问题
arrow::cast是较新版本arrow包才导出的函数,若提示不存在,先升级arrow包:
install.packages("arrow") # 或从GitHub安装最新开发版 # remotes::install_github("apache/arrow/r")
升级后即可使用cast函数转换类型:
library(dplyr) df <- df %>% mutate(name = arrow::cast(name, arrow::string()))
内容的提问来源于stack exchange,提问作者pluke
相关产品推荐
相关产品推荐

