Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取列不一致的文件时出现R data.table问题_R_Data.table_Fread - Fatal编程技术网

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

读取列不一致的文件时出现R data.table问题,r,data.table,fread,R,Data.table,Fread,当我使用Rdata.table(fread)读取dat文件(3GB)时,出现了一个问题: 在3169933线上提前停止。预计有136个字段,但发现138个。考虑填充=真和注释.char =。第一个丢弃的非空行: 我的代码: library(data.table) file_path = 'data.dat' # 3GB fread(file_path,fill=TRUE) 问题是我的文件有大约500万行。详细内容: 从第1行到第3169933行,它有136列 从第3169933行到第500

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

在3169933线上提前停止。预计有136个字段,但发现138个。考虑填充=真和注释.char =。第一个丢弃的非空行:

我的代码:

library(data.table)
file_path = 'data.dat' # 3GB
fread(file_path,fill=TRUE)
问题是我的文件有大约500万行。详细内容:

  • 从第1行到第3169933行,它有136列
  • 从第3169933行到第5000000行,它有138列
由于此错误,
fread()
仅将我的文件读取到第3169933行
fill=TRUE
在这种情况下没有帮助。有人能帮我吗

R版本:3.6.3 数据表版本:1.13.2

注意:在这种情况下,fill=TRUE:

[案例1-不是我的案例]如果我的文件的第1部分(50%行)有138列,第2部分有136列,那么fill=TRUE将有帮助(它将用NA填充第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(

expr={dt1平台?R版本?在分别导入两个数据块后。或者使用awk将“、NA”附加到前3169933行。什么意思是“fill=TRUE没有帮助”-如果使用
fill=TRUE
?@VasilyA:当我设置fill=TRUE时,错误仍然发生:在316993行早期停止,预期136个字段但找到138。@Severin Pappadeux:我使用R studio,版本:3.6.3,数据表版本:1.13.2@Anderson-朱:谢谢您的帮助。问题是某些DAT文件将停止earlier在第3169933行中,其他行将在不同的行中提前停止(例如:第2886321行或3500212行…)。我无法在一般情况下使用特定的数字设置nrows。我还尝试从该警告错误中提取与行号问题相关的字符串(例如,在本例中为3169933)但不可行。您有什么建议如何从该警告错误中提取与行号问题相关的字符串吗?如果识别出错误行,我可以将该文件分为两部分,并按照您的建议合并为一个文件。另一个可能的解决方案是逐行读取数据,以便您可以检查ea的列数ch row.希望这有帮助。@Anderson Zhu:非常感谢您的积极支持。我将尝试此解决方案并与上述方法进行比较!About fill=TRUE:[案例1]如果我的文件的第1部分有138列,第2部分有136列,则fill=TRUE将有帮助(它将用NA填充第2部分的两列),但[案例2]如果我的文件的第1部分有136列,第2部分有138列,那么fill=TRUE在这种情况下没有帮助。在第2部分中,您的解决方案将有助于顺利阅读此文件。再次感谢您!