使用readr读取partyfacts CSV时误报列数不符问题求助
解决readr读取PartyFacts CSV文件的解析警告问题
问题背景
执行以下代码读取PartyFacts的CSV文件时出现解析警告:
download.file("https://partyfacts.herokuapp.com/download/external-parties-csv/", "partyfacts-external-parties.csv") df <- readr::read_csv("partyfacts-external-parties.csv", show_col_types = FALSE)
调用problems(df)显示86条问题,均提示行的实际列数少于预期(如行35519被报为15列,但实际文本内容包含17列),且R显示的行号与文本编辑器中的行号不匹配。
解决方案
1. 处理带引号的换行字段
这类问题大多是CSV中存在带引号且包含换行的字段:readr会将引号内的换行识别为字段内容的一部分,而文本编辑器会把这些换行算作新行,导致行号错位;若引号未正确闭合,还会引发列数判断错误。
可以强制指定引号规则并设置编码:
df <- readr::read_csv("partyfacts-external-parties.csv", show_col_types = FALSE, quote = "\"", # 强制使用双引号解析字段 locale = readr::locale(encoding = "UTF-8"))
2. 用base R工具验证文件完整性
先用read.csv测试文件是否能正常读取,排除文件损坏的可能:
df_base <- read.csv("partyfacts-external-parties.csv", stringsAsFactors = FALSE)
如果read.csv能正常加载,说明是readr的解析规则问题,可尝试开启转义字符处理:
df <- readr::read_csv("partyfacts-external-parties.csv", show_col_types = FALSE, escape_backslash = TRUE)
3. 精准定位问题行
由于R和编辑器的行号不一致,可通过read_lines读取所有行,结合problems(df)的信息定位异常内容:
lines <- readr::read_lines("partyfacts-external-parties.csv") # 示例:查看问题行35519前后的内容 cat(lines[35518:35520], sep = "\n")
通过这种方式能直接看到readr识别的行内容,排查未闭合引号或特殊字符。
4. 重新下载文件(避免损坏)
下载过程中可能出现文件截断或编码异常,重新下载时添加二进制模式参数:
file.remove("partyfacts-external-parties.csv") download.file("https://partyfacts.herokuapp.com/download/external-parties-csv/", "partyfacts-external-parties.csv", mode = "wb") df <- readr::read_csv("partyfacts-external-parties.csv", show_col_types = FALSE)
内容的提问来源于stack exchange,提问作者robertspierre
相关产品推荐
相关产品推荐

