2015-09-07 2 views
1

Я пытаюсь прочитать большой файл в r. При попытке прочитать это происходит. Даже когда я пропускаю первые 800607 строк, он не исчезает. Я также попытался удалить строку в терминале с помощью команды.Пропустить строки/строки, которые создают ошибки в fread R

sed '800608d' filename.csv 

Это не решило мою проблему. Я был бы очень признателен, если бы вы могли мне помочь.

оригинальная ошибка я получил от R является:

> data<-fread("filename.csv") 
Read 2.0% of 34143409 rows 
Error in fread("filename.csv") : 
Field 16 on line 800607 starts with quote (") but then has a problem. It can contain balanced unescaped quoted subregions but if it does it can't contain embedded \n as well. Check for unbalanced unescaped quotes: """The attorney for Martin's family, Benjamin Crump, says the evidence is ""irrelevant\"""" """".","NULL","NULL","NULL","NULL","NULL","NULL","NULL","Negative" 
In addition: Warning message: 
In fread("filename.csv") : 
Starting data input on line 8 and discarded previous non-empty line: done 
+0

Это очень сложный вопрос. Проблема заключается в том, что у вас есть столбец в вашем файле, который использует те же специальные символы, что и структура файла («для цитирования», «как разделитель и т. Д.»), Поэтому он полностью испортил формат файла. Идеальным способом было бы измените формат файла, если у вас есть доступ к исходному файлу, например, установите символ кавычки по умолчанию как «вместо». В противном случае было бы полезно предоставить фактический файл, чтобы мы могли также взглянуть на него –

+0

К сожалению, мне не разрешено предоставлять доступ, а изменить формат файла займет много времени. – Carlo

ответ

1

Я в настоящее время в середине решения такого рода вопросы самого. Я не уверен, что это будет работать для всех случаев - не говоря уже о всех файлах, которые я работаю с собой. Но теперь я, кажется, получают некоторые успехи с:

skip.list <- c() 

for (i in 1:length(dir(input.dir))){ # i=3 
    file <- dir(input.dir)[i] 
    ingested.file <- NULL 
    ingested.file <- try(fread(paste0(input.dir,file), header=T, stringsAsFactors=F)) 
    if (class(ingested.file)=="try-error") { 
    error.line <-as.integer(sub(" .*","",sub(".*but line ","",as.character(ingested.file)))) 
    app.reviews.input <- try(fread(paste0(input.dir,file), header=T, stringsAsFactors=F,skip=error.line)) 
    if (class(ingested.file)=="try-error") { 
     skip.list_by.downloads <- c(skip.list_by.downloads, file) 
     next 
    } 
    } 
} 

Я в настоящее время работает около 750 файлов по 1000 строк в каждой - около 50 из которых имеют один и тот же вопрос. Однако с помощью этого метода я могу читать 30 из этих 50; остальные 20, кажется, имеют ошибки в нескольких строках, но я не могу указать несколько значений пропуска.

Если бы можно было указать больше пропусков, вы могли бы попробовать выполнить while-statement. то есть

while (class(ingested.file)=="try-error") ..., а затем обновите error.list столько раз, сколько необходимо автоматически.

Надеюсь, это поможет!

+0

Извините, последнее добавление: Возможно, вам придется изменить значение error.line в зависимости от того, какие ошибки вы получаете. – mjfred

+0

Вместо добавления этого добавления в качестве комментария, лучше, если вы [отредактируете] его в свой ответ. Комментарии не гарантируются, и некоторые люди не читают их. Спасибо! –