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

使用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)

问题根源

  1. 内存过载:把整个大文件读成单个字符串,内存占用远超R的处理上限,直接触发致命错误。
  2. 分隔符处理错误:strsplit的分割符" | | "是无效正则,无法正确拆分列;硬编码ncol=18,遇到不完整行(如示例最后一行)会导致矩阵转换失败。
  3. 正则语法错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:24:53