Подтвердить что ты не робот

Ошибка "Встроенный nul in string" при импорте csv с fread

У меня есть большой файл (3.5G), который я пытаюсь импортировать с помощью data.table::fread.

Он был первоначально создан из файла rpt, который был открыт как текст и сохранен как CSV.

Это отлично работает с меньшими файлами (одного и того же типа данных - одни и те же столбцы и все. Это просто для более длительного таймфрейма и более широкого охвата).

Когда я пытаюсь запустить

mydata <- fread("mycsv.csv")

Я получаю сообщение об ошибке:

Ошибка в fread ( "mycsv.csv" ): embedded nul в строке: 'y\0e\0a\0r\0'

Что это значит?

4b9b3361

Ответ 1

Мы можем удалить нулевые терминаторы в командной строке, используя что-то вроде:

sed 's/\\0//g' mycsv.csv > mycsv.csv

Или, как было предложено @marbel, fread позволяет передать sed-вызов внутри текста. Например:

fread("sed 's/\\0//g' mycsv.csv")

Ответ 2

В этом случае вы можете использовать read.csv с файловым кодированием UTF-16LE, а не fread.

read.csv("mycsv.csv",fileEncoding="UTF-16LE")

Учитывая размер ваших данных, использование read.csv займет пару минут, но я думаю, что это не очень важно.

Ответ 3

Вы можете проверить эту небольшую функцию:

cleanFiles<-function(file,newfile){
  writeLines(iconv(readLines(file,skipNul = TRUE)),newfile)
}

Это работает для меня

Ответ 4

Нетехнический способ решить это будет,

  • Откройте проблемный .csv

  • Ctrl + A (Выбрать все)

  • Откройте новый лист Excel

  • Щелкните правой кнопкой мыши и выберите "Вставить как значения"

  • Сохраните и используйте этот файл вместо оригинального.

Работал для меня и не занимал много времени.

Ответ 5

Если вы видите символы NUL (x00) в файле ASCII, вы можете сделать это: data.table :: fread (text = readLines (pathIn, skipNul = T),...)