如何用R的read.csv正确导入含跨多行引号的CSV文件?
解决跨行引号CSV的读取问题及列数不一致的排查方案
针对你遇到的跨行引号CSV读取难题,以及部分文件列数异常的问题,我给你整理了一套可靠的解决方案,同时结合你的词分析需求给出优化建议:
一、优先用readr包处理跨行引号(推荐)
Base R的read.csv在处理跨行引号时容易出现解析错误,而readr包的read_csv函数采用了更现代的解析引擎,默认就能正确识别跨行的双引号,同时保留引号内的逗号(不会被当成分隔符)。
步骤1:安装并加载依赖包
install.packages(c("readr", "purrr")) library(readr) library(purrr)
步骤2:批量读取所有CSV文件
# 获取所有CSV的完整路径,避免拼接错误 csv_files <- list.files(path = "Plenarprotokolle/", pattern = "\\.csv$", full.names = TRUE) # 批量读取,强制所有列为字符型(避免类型推断导致列数错位) AlleProtokolleSafe <- map(csv_files, ~ read_csv( .x, col_names = FALSE, # 无表头,符合你的需求 quote = "\"", # 识别双引号,处理跨行内容 col_types = cols(.default = col_character()), # 所有列按字符读取 locale = locale(encoding = "UTF-8") # 指定UTF-8编码 ))
这个方法的优势:
- 自动处理跨行引号,无需额外配置
- 速度远快于base R的循环读取
- 读取时会在控制台输出解析警告,帮你定位异常文件的问题
二、排查162/191.csv列数异常的问题
你提到这两个文件只有3列,而其他文件有15列,大概率是这两个文件存在引号不规范的问题(比如未闭合的引号、引号内的特殊字符),导致解析器错误拆分了字段。
用readr的problems()函数可以精准定位问题:
# 单独读取异常文件并查看解析错误 problem_df <- read_csv("Plenarprotokolle/162.csv", col_names = FALSE, locale = locale(encoding = "UTF-8")) problems(problem_df)
输出会显示具体哪一行、哪一列出现了解析错误(比如expected 15 columns, got 3或者unclosed quote),你可以根据提示手动修正这些文件的格式,或者在读取时添加参数trim_ws = TRUE去除多余空格,尝试修复轻微的格式问题。
三、针对词分析的优化建议
既然你只需要纯文本内容,完全可以在读取后直接提取目标列,避免冗余数据:
# 假设文本内容在第2列(根据你的数据集调整列索引) all_speech_texts <- map(AlleProtokolleSafe, ~ .x[[2]]) # 合并所有文本为一个向量,方便后续词分析 combined_text <- unlist(all_speech_texts)
如果坚持使用Base R,也可以尝试以下配置,但稳定性不如readr:
AlleProtokolleSafe <- list() listcsv <- dir(path = "Plenarprotokolle/", pattern = "*.csv") for (k in 1:length(listcsv)){ file_path <- file.path("Plenarprotokolle", listcsv[k]) AlleProtokolleSafe[[k]] <- read.csv( file_path, sep = ",", header = FALSE, quote = "\"", encoding = "UTF-8", fill = TRUE, # 自动填充缺失列,避免列数不一致报错 stringsAsFactors = FALSE, allowEscapes = FALSE # 禁止转义引号,避免误解析跨行内容 ) }
内容的提问来源于stack exchange,提问作者Lennart Herrmann
相关产品推荐
相关产品推荐

