使用R导入特定格式大TXT文件时触发致命错误,寻求解决方案
导入特殊格式大TXT文件的致命错误解决方案
问题场景
需要导入的TXT文件格式如下(部分内容):
"X1" | | "ID_T34" | | "Herstellernummer" | | "Werksnummer" | | "Fehlerhaft" | | "Fehlerhaft_Datum" | | "Fehlerhaft_Fahrleistung" | | "Produktionsdatum_Origin_01011970" | | "origin" "1" | | 1 | | "34-217-2173-2" | | "217" | | "2173" | | 0 | | NA | | 0 | | 14190 | | "01-01-1970" "2" | | 2 | | "34-217-2173-24" | | "217" | | "2173" | | 1 | | 2010-04-17 | | 26336.7397260274 | | 14190 | | "01-01-1970" "3" | | 3 | | "34-218-2182-45" | | "218" | | "2182" | | 1 | | 2010-04-17 | | 26336.7397260274 | | 14190 | | "01-01-1970" "9" | | 9 | | "34-218-
使用以下代码导入时触发致命错误:
data_T34 <- paste(scan("Einzelteil_T34.txt", what="character"), collapse='') ## Read the file dmat_T34 <- matrix(strsplit(data_T34, " | | ")[[1]], ncol=18, byrow=TRUE) ## Convert it to a matrix dmat_T34[, 18] <- gsub("\\".*[0-9]\\"", "", dmat_T34[, 18]) ## Remove the next line number from the values of the last column colnames(dmat_T34) <- dmat_T34[1, ] ## Take first line as names dmat_T34 <- dmat_T34[-1, ] ## Remove first line (as it contained the names) df_T34 <- as.data.frame(dmat_T34)
问题根源
- 内存过载:把整个大文件读成单个字符串,内存占用远超R的处理上限,直接触发致命错误。
- 分隔符处理错误:
strsplit的分割符" | | "是无效正则,无法正确拆分列;硬编码ncol=18,遇到不完整行(如示例最后一行)会导致矩阵转换失败。 - 正则语法错误:
gsub的正则表达式存在转义错误,无法正确处理末尾内容。
解决方案
方案1:使用base R的read.table(无需额外包)
df_T34 <- read.table("Einzelteil_T34.txt", sep = "\\s*\\|\\s*\\|\\s*", # 匹配任意空格+|+任意空格+|+任意空格 header = TRUE, quote = "\"", na.strings = "NA", stringsAsFactors = FALSE, fill = TRUE, # 自动补全不完整行的缺失列 comment.char = "") # 避免误识别注释
方案2:使用data.table的fread(大文件更高效)
library(data.table) df_T34 <- fread("Einzelteil_T34.txt", sep = "\\s*\\|\\s*\\|\\s*", header = TRUE, quote = "\"", na.strings = "NA", fill = TRUE, verbose = FALSE) # 关闭日志输出,提升速度
说明
- 两个方案都能自动处理大文件的内存问题,无需一次性加载全部内容。
- 正则分隔符
\\s*\\|\\s*\\|\\s*会忽略列之间的空格差异,正确拆分每一列。 fill=TRUE可以处理文件末尾的不完整行,避免报错。
内容的提问来源于stack exchange,提问作者Danny Kiesler
相关产品推荐
相关产品推荐

