Вопрос по data.table, r, sed, csv, fread – 'Embedded nul in string' при импорте большого CSV (8 ГБ) с помощью fread ()

2

У меня есть большой файл CSV (8,1 ГБ), который я пытаюсь перебрать в R. Я создал CSV, используя csvkit Pythonin2csv, преобразованный из файла .txt, но каким-то образом преобразование привело к появлению в файле нулевых символов. Теперь я получаю эту ошибку при импорте:

Error in fread("file.csv", nrows = 100) : embedded nul in string: 'ÿþr\0e\0c\0d\0_\0z\0i\0p\0c\0'

I я возможность импортировать небольшие куски просто отлично сread.csv хотя, но это потому, что он позволяет кодировать UTF-16 черезfileEncoding аргумент.

test <- read.csv("file.csv", nrows=100, fileEncoding="UTF-16LE")

Я не смею пытаться импортировать 8 ГБ файл сread.csv, хоть.

Поэтому я попробовал предложенное решениеВот, в котором вы используетеsed s/\\0//g file.csv > file2.csv вытащить нули. Команда выполнилась очень хорошо и заполнила новый 8-гигабайтный файл CSV, но я получил почти идентичную ошибку:

Error in fread("file2.csv", nrows = 100) : embedded nul in string: 'ÿþr\0e\0c\0d\0_\0z\0i\0p\0c\0,\0p\0o\0s\0t\0_\0z\0i

Итак, это не сработало. Я в тупике на этом этапе. Учитывая размер файла, я не могу использоватьread.csv в целом, и я не уверен, как избавиться от нулей в оригинальном CSV. Я даже не уверен, как файл был закодирован как UTF-16. Любые предложения или советы будут с благодарностью на этом этапе.

Изменить: я на машине с Windows.

если вы никогда не получите этот фид данных снова через тот же процесс, похоже, что будет целесообразно исправить данные в источнике :-( ... но это другой вопрос. Удачи! shellter

Ваш Ответ

3   ответа
0

что бессмысленные символы происходят, потому что файл сжат. Это то, что я нашел при попытке прочитатьvcf.gz файлы.fread Кажется, не поддерживает чтение сжатых файлов. Смотрите, напримерhttps://github.com/Rdatatable/data.table/issues/717

readLines() а такжеread.table() Поддержка сжатых файлов, но они медленнее.

0

http://win-bash.sourceforge.net/ и удалите строки с нулевым символом в конце, используя инструменты Linux, как описано, например, здесь:Выявление и удаление нулевых символов в UNIX или здесьОшибка 'Embedded nul in string' при импорте csv с fread

3

Если вы используете Linux / Mac, попробуйте это

file <- "file.csv"
tt <- tempfile()  # or tempfile(tmpdir="/dev/shm")
system(paste0("tr < ", file, " -d '\\000' >", tt))
fread(tt)
Я, к сожалению, на Windows (должен был указать, что ранее, извинения); У меня, однако, установлен GnuWin32. Вот как я смог использоватьsed до. Есть ли эквивалент, который я мог бы запустить? AnnotBib

Похожие вопросы