R语言读取分隔符与引号同为双引号的CSV文件问题
解决双引号同时作为分隔符和字段包裹符的CSV读取问题
方法1:预处理文本替换分隔符(最稳妥)
先将作为分隔符的单个双引号替换为标准分隔符(比如逗号),同时保留字段内的双引号格式,再用常规方法读取。
# 1. 读取文件所有行 lines <- readLines("your_file.csv") # 2. 替换分隔符:将单独的"(前后不是")替换为逗号 # 正则匹配确保只替换用作分隔的单个引号 processed_lines <- gsub('(?<!")"(?!")', ',', lines, perl = TRUE) # 3. 处理字段内的双引号:把""替换为单个"(若不需要保留引号可替换为空) processed_lines <- gsub('""', '"', processed_lines) # 4. 读取处理后的内容 df <- read.csv(text = processed_lines, header = TRUE, quote = '"', stringsAsFactors = FALSE)
解释:
(?<!")"(?!")是Perl风格正则,匹配前后都不是双引号的单个",这些就是字段分隔符;- 替换后文件变为标准CSV格式,
read.csv可正常解析,字段内的引号也会被正确识别。
方法2:用data.table::fread快速解析
fread对非标准CSV兼容性更强,直接指定分隔符为双引号,再过滤空列:
library(data.table) # 读取文件,指定分隔符为",禁用引号识别 dt <- fread("your_file.csv", sep = '"', quote = '', header = TRUE, stringsAsFactors = FALSE) # 移除全为空的列(分隔符导致的多余空列) dt <- dt[, colSums(is.na(dt)) != nrow(dt), with = FALSE]
解释:
sep='"'告诉fread用双引号作为字段分隔符;quote=''禁用引号解析功能,避免混淆分隔符和字段内的引号;- 最后过滤空列,得到干净的数据集。
方法3:用readr::read_delim灵活配置
readr的read_delim支持自定义分隔符和引号规则,适合处理复杂格式:
library(readr) library(dplyr) # 读取文件,指定分隔符为",禁用引号,自动修剪空白 df <- read_delim("your_file.csv", delim = '"', quote = '', trim_ws = TRUE, skip_empty_rows = TRUE, show_col_types = FALSE) %>% # 移除所有全为空的列 select(where(~!all(is.na(.))))
解释:
trim_ws=TRUE自动去除字段前后的空白;select(where(~!all(is.na(.))))简洁过滤空列,适用于R 4.0+版本。
针对第二个示例文件的说明
第二个文件存在连续""(空字段),以上方法同样适用:预处理后连续""会变成单个",读取时会识别为空值;用fread或read_delim时,空列会被过滤,空字段会保留为NA,符合数据实际情况。
内容的提问来源于stack exchange,提问作者Daan
相关产品推荐
相关产品推荐

