如何在R中使用fread忽略引号内的管道分隔符?
解决fread读取管道分隔文件时引号内分隔符被拆分的问题
核心解决方案:确保fread正确识别引号配对
fread的quote参数本就会忽略引号内的分隔符,先确认调用参数与文件格式是否匹配:
保持
quote="\""(该参数默认值即为双引号,可省略),同时确保文件中所有含管道符的发票编号都被成对的英文双引号包裹,正确格式示例:"INVC7-6191 | LLOU760-1"|其他列内容|...
测试读取代码:
library(data.table) Invoice <- fread("invoice.txt", sep="|", quote="\"", header=FALSE, fill=TRUE, col_types=c(V6="character"))正常情况下,引号内的管道符会被当作内容的一部分,不会触发列拆分。
排查常见格式问题
如果上述代码仍失效,检查以下几点:
- 确认文件中没有未闭合的双引号(某行仅存在开头引号但无结尾引号),这类情况会导致
fread误判分隔符位置 - 确保文件中的引号都是英文双引号,避免混入中文引号(
“”) - 若文件存在转义的双引号(比如
"),需添加escape="\\"参数:Invoice <- fread("invoice.txt", sep="|", quote="\"", escape="\\", header=FALSE, fill=TRUE, col_types=c(V6="character"))
替代预处理方案
如果文件格式存在难以修正的问题,可手动预处理内容:
- 先用
readLines读取所有行 - 将引号内的管道符替换为临时占位符,读取后再还原:
library(data.table) # 读取文件所有行 lines <- readLines("invoice.txt") # 替换引号内的|为临时字符(比如###) lines <- gsub('"([^"]*)\\|([^"]*)"', '"\\1###\\2"', lines, perl=TRUE) # 用预处理后的内容读取 Invoice <- fread(text=lines, sep="|", quote="\"", header=FALSE, fill=TRUE, col_types=c(V6="character")) # 将临时字符还原为|(替换列名需对应实际发票编号所在列) Invoice$V1 <- gsub("###", "|", Invoice$V1)
内容的提问来源于stack exchange,提问作者Shashank Bharadwaj
相关产品推荐
相关产品推荐

