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 万行。详细:
- 从第 1 行到第 3169933 行,它有 136 列
- 从第 3169933 行到第 5000000 行,它有 138 列
由于此错误,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()
构造捕获警告消息,以便您可以提取行号并进行相应处理。
当我使用 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 万行。详细:
- 从第 1 行到第 3169933 行,它有 136 列
- 从第 3169933 行到第 5000000 行,它有 138 列
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()
构造捕获警告消息,以便您可以提取行号并进行相应处理。