Ошибка "Встроенный 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'
Что это значит?
Ответы
Ответ 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),...)