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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:58:12