You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言fread读取CSV:指定UTF-8仍报错及列选择问题

问题原因及解决办法

1. 先修正代码中的重复列名问题

你的select参数里重复选了两次"PrecinctName",虽然这不一定直接引发编码报错,但会干扰数据解析,先删掉其中一个:

kings_precincts_2023 <- fread("kings_precincts_2023.csv",
                          encoding = "UTF-8",
                          header = TRUE,
                          select = c("CountyName", 
                                     "PrecinctName", 
                                     "JudicialName", 
                                     "CountyLegName",
                                     "CityCouncilName",
                                     "CD",
                                     "HD",
                                     "SD",
                                     "City"))

2. 文件实际编码并非UTF-8

fread的encoding参数是指定读取时采用的编码格式,如果文件本身是GBK、ISO-8859-1等其他编码,强行用UTF-8读取就会报错。

  • 用文本编辑器(如Notepad++)打开文件,查看右下角的编码标识,确认真实编码;
  • 或者在R中测试不同编码读取前几行,看哪组无乱码:
# 测试不同编码读取前10行
test_utf8 <- readLines("kings_precincts_2023.csv", n = 10, encoding = "UTF-8")
test_gbk <- readLines("kings_precincts_2023.csv", n = 10, encoding = "GBK")
test_latin1 <- readLines("kings_precincts_2023.csv", n = 10, encoding = "ISO-8859-1")
# 查看输出,选择无乱码的编码

找到正确编码后,替换fread中的encoding参数值即可。

3. 文件含UTF-8 BOM(字节顺序标记)

部分UTF-8文件会带有BOM标识,导致fread识别编码出错,可添加skipBOM = TRUE参数跳过:

kings_precincts_2023 <- fread("kings_precincts_2023.csv",
                          encoding = "UTF-8",
                          header = TRUE,
                          skipBOM = TRUE,
                          select = c("CountyName", 
                                     "PrecinctName", 
                                     "JudicialName", 
                                     "CountyLegName",
                                     "CityCouncilName",
                                     "CD",
                                     "HD",
                                     "SD",
                                     "City"))

4. data.table版本兼容问题

旧版本的data.table中encoding参数行为可能有差异,可尝试升级data.table到最新版,或者改用locale参数指定编码:

library(data.table)
kings_precincts_2023 <- fread("kings_precincts_2023.csv",
                          locale = locale(encoding = "UTF-8"),
                          header = TRUE,
                          select = c("CountyName", 
                                     "PrecinctName", 
                                     "JudicialName", 
                                     "CountyLegName",
                                     "CityCouncilName",
                                     "CD",
                                     "HD",
                                     "SD",
                                     "City"))

内容的提问来源于stack exchange,提问作者Fred Ditzian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:25:03