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
相关产品推荐
相关产品推荐

