R data.table 读取列不一致的文件时出现问题

R data.table problem when read file with inconsistent column

当我使用 R data.table(fread) 读取 dat 文件 (3GB) 时出现问题:

Stopped early on line 3169933. Expected 136 fields but found 138. Consider fill=TRUE and comment.char=. First discarded non-empty line:

我的代码:

library(data.table)
file_path = 'data.dat' # 3GB
fread(file_path,fill=TRUE)

问题是我的文件有大约 500 万行。详细:

由于此错误,

fread() 仅将我的文件读取到第 3169933 行。 fill = TRUE 在这种情况下没有帮助。谁能帮帮我?

R版本:3.6.3 data.table版本:1.13.2

关于 fill=TRUE 的注意事项:

[案例 1- 不是我的情况] 如果我的文件的第 1 部分(50% 行)有 138 列,第 2 部分有 136 列,那么 fill=TRUE 会有所帮助(它将在第 2 部分中填充两列不适用)

[案例 2- 我的案例] 如果我的文件的第 1 部分(50% 行)有 136 列,第 2 部分有 138 列,那么 fill =TRUE 在这种情况下将无济于事。

尝试分开阅读,在为第一部分创建额外的两列后合并它们。

first_part = fread('data.dat', nrows = 3169933) %>%
  mutate(extra_1 = NA, extra_2 = NA)

second_part = fread('data.dat', skip = 3169933)
df = bind_rows(first_part, second_part)

不确定为什么即使使用 fill=T 仍然有问题...但如果没有任何帮助,您可以尝试使用以下方法:

tryCatch(
  expr    = {dt1 <<- fread(file_path)},
  warning = function(w){
    cat('Warning: ', w$message, '\n\n');
    n_line <- as.numeric(gsub('Stopped early on line (\d+)\..*','\1',w$message))
    if (!is.na(n_line)) {
      cat('Found ', n_line,'\n')
      dt1_part1 <- fread(file_path, nrows=n_line)
      dt1_part2 <- fread(file_path, skip=n_line)
      dt1 <<- rbind(dt1_part1, dt1_part2, fill=T)
    }
  },
  finally = cat("\nFinished. \n")
);

tryCatch() 构造捕获警告消息,以便您可以提取行号并进行相应处理。