Проблема R data.table при чтении файла с несогласованным столбцом

Когда я использую R data.table(fread) для чтения dat файла (3 ГБ), возникает проблема:

Остановлен раньше на строке 3169933. Ожидалось 136 полей, но найдено 138. Рассмотрим fill=TRUE и comment.char=. Первая отброшенная непустая строка:

введите здесь описание изображения

Мой код:

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

Проблема в том, что в моем файле ~ 5 миллионов строк. В деталях:

  • От строки 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 с NA)

[Случай 2 - мой случай] если часть 1 моего файла (50% строк) имеет 136 столбцов, а часть 2 имеет 138 столбцов, то fill = TRUE в этом случае не поможет.


person duy ngọc    schedule 15.11.2020    source источник
comment
Платформа? Р версия?   -  person Severin Pappadeux    schedule 15.11.2020
comment
stackoverflow.com/questions/44464441/ после раздельного импорта двух блоков данных. Или используйте awk для добавления ,NA,NA к первым 3169933 строкам.   -  person IRTFM    schedule 15.11.2020
comment
что значит fill=TRUE не помогло - в чем проблема если вы использовали fill=TRUE?   -  person Vasily A    schedule 15.11.2020
comment
@VasilyA: когда я устанавливаю fill = TRUE, ошибка все еще возникает: остановлено раньше в строке 316993, ожидалось 136 полей, но найдено 138.   -  person duy ngọc    schedule 15.11.2020
comment
@ Северин Паппаде: я использую R studio с версией R: 3.6.3, версия data.table: 1.13.2   -  person duy ngọc    schedule 15.11.2020


Ответы (2)


Не уверен, почему у вас все еще есть проблема даже с 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() перехватывает предупреждающее сообщение, поэтому вы можете извлечь номер строки и обработать его соответствующим образом.

person Vasily A    schedule 15.11.2020
comment
О fill=TRUE: [Случай 1] если часть 1 моего файла имеет 138 столбцов, а часть 2 имеет 136 столбцов, тогда поможет fill=TRUE (он заполнит два столбца в части 2 с помощью NA), но [Случай 2], если часть 1 моего файла имеет 136 столбцов, а часть 2 имеет 138 столбцов, тогда fill = TRUE в этом случае не поможет. В случае 2 ваше решение поможет без проблем прочитать этот файл. Еще раз большое спасибо! - person duy ngọc; 15.11.2020

Попробуйте прочитать их по отдельности, объедините после создания двух дополнительных столбцов для первой части.

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)
person Gejun    schedule 15.11.2020
comment
@ Андерсон Чжу: Спасибо за вашу помощь. Проблема в том, что некоторые файлы DAT останавливаются раньше в строках 3169933, другие останавливаются раньше в другой строке (например: строка 2886321 или 3500212....). Я не могу установить nrows с определенным номером в общем случае. Я также пытаюсь извлечь строку, связанную с проблемой номера строки, из этой ошибки предупреждения (например, 3169933 в данном случае), но это невозможно. Есть ли у вас какие-либо предложения, как извлечь строку, связанную с проблемой номера строки, из этой ошибки предупреждения? если строка ошибки распознана, я могу разделить этот файл на две части и объединить в один файл, как вы предлагаете. - person duy ngọc; 15.11.2020
comment
Другое возможное решение — читать ваши данные построчно, чтобы вы могли проверить количество столбцов для каждой строки. см. stackoverflow.com/questions/11664075/import-dat- file-into-r Надеюсь, это поможет. - person Gejun; 15.11.2020
comment
@ Андерсон Чжу: Большое спасибо за вашу профессиональную активную поддержку. Я попробую это решение и сравним с вышеуказанным методом! - person duy ngọc; 16.11.2020