Несколько строк в файле .csv не имеют одинакового количества элементов в R

Я пытаюсь прочитать очень большой файл .csv в R

OrigTotalPumping <- read.table("/Users/Larry/Desktop/OrigTotalPumping/MasterOrigFt3.csv", 
                               header=F, sep=",")

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

Ошибка при сканировании (файл, что, nmax, sep, dec, quote, skip, nlines, na.strings,: строка 19437 не содержит 7 элементов

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

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
  line 2 did not have 7 elements

а также

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
  line 19439 did not have 7 elements

Как мне настроить его так, чтобы он мог читать этот файл, несмотря на эту проблему?


person user3736201    schedule 13.07.2014    source источник
comment
А вы точно знаете, что вызывает эту проблему? Вы знаете, почему эта линия короче других?   -  person MrFlick    schedule 13.07.2014
comment
почему бы вам не попробовать параметр colclasses на определенный номер. столбцов в вашем CSV.   -  person Aashu    schedule 13.07.2014
comment
Вы можете распечатать плохую строку с помощью scan("MasterOrigFt3.csv", "character", skip=19436, n=1, sep="\n")   -  person MrFlick    schedule 13.07.2014
comment
@MrFlick нет, я не знаю; файл такой большой, что я даже не могу открыть его для просмотра.   -  person user3736201    schedule 13.07.2014
comment
@ user3736201, поэтому Флик предлагал вам scan просто плохую строчку. У R не должно возникнуть проблем с этим. Точно так же вы можете назначить все плохие строки для baddies с помощью txt <- readLines("/Users/Larry/Desktop/OrigTotalPumping/MasterOrigFt3.csv"); baddies <- txt[which(count.fields(textConnection(txt), ',') != 7].   -  person jbaums    schedule 13.07.2014
comment
Чтобы читать только строки с 7 полями, вы можете использовать: Можно сделать что-то вроде: txt <- readLines("/Users/Larry/Desktop/OrigTotalPumping/MasterOrigFt3.csv"); OrigTotalPumping <- read.csv(text=txt[which(count.fields(textConnection(txt), ',') == 7)], header=FALSE) (Это исправляет опечатку из моего предыдущего, теперь удаленного комментария).   -  person jbaums    schedule 13.07.2014
comment
Не видел этого комментария до того, как ответил. Я только что сканировал, и в строках одинаковое количество элементов   -  person user3736201    schedule 13.07.2014
comment
С другой стороны, см. этот пост для предложений текстовых редакторов, которые могут открывать / редактировать текстовые файлы размером порядка несколько ГБ.   -  person jbaums    schedule 13.07.2014
comment
Я думаю, что открою его и посмотрю в vim, но я не думаю, что есть что редактировать, судя по его внешнему виду ... кажется (глядя на конкретные строки) у них есть 7 элементов?   -  person user3736201    schedule 13.07.2014
comment
Также, может быть, попробовать установить ,quote = "" в read.table(). Это то, что обычно вызывает подобные ошибки.   -  person David Arenburg    schedule 13.07.2014
comment
@ user3736201 Можете ли вы отредактировать свой вопрос, чтобы включить плохую строку? Есть там # или '? Это можно исправить, задав параметры quote= или comment=.   -  person MrFlick    schedule 13.07.2014


Ответы (2)


Не пропускайте его, а лучше поместите этот код в цикл и в блок trycatch. И сделайте обработку ошибок для выданной записи / записей. Как выполнить trycatch в R: вот ссылка на то же самое

person ak0053792    schedule 13.07.2014

Можете ли вы предварительно обработать файл с помощью awk таким образом, чтобы создать очищенный файл, в котором каждая строка имеет 7 полей?

awk 'NF==7' original.csv > cleaned.csv

или, если разделителем полей является запятая

awk -F',' 'NF==7' original.csv > cleaned.csv

Или, основываясь на идее @Spacedman, вы можете использовать awk, чтобы просто показать вам "несчастливые" строки, в которых нет 7 полей.

awk -F',' 'NF!=7 {print "Line " NR $0}' yourfile.csv | more
person Mark Setchell    schedule 13.07.2014
comment
Звучит ФАНТАСТИЧЕСКИ! Разделителями полей являются запятые, но после его запуска я получил пустой файл. - person user3736201; 13.07.2014
comment
Пожалуйста, возьмите несколько строк из своего файла и отредактируйте их в своем вопросе. Получите их вот так head -3 yourfile.csv > sample.csv - person Mark Setchell; 13.07.2014
comment
Еще лучше вы можете использовать awk, чтобы просмотреть строки с ошибками: awk 'NR==19437' original.csv или awk 'NR>19400' original.csv | more и выяснить, отсутствуют ли в них запятые, кавычки и т. Д. (NR в awk - это номер записи). И приличный текстовый редактор должен уметь читать большой CSV-файл для редактирования, если вам придется делать это вручную. - person Spacedman; 13.07.2014
comment
@Spacedman Хорошее предложение, спасибо, я отредактировал (модификацию) его в своем ответе, чтобы все могли видеть, не просматривая комментарии. - person Mark Setchell; 13.07.2014
comment
Это сработало для вас? Если да, не могли бы вы принять его в качестве своего ответа, щелкнув пустую галочку (галочку) рядом с подсчетом голосов? Если нет, скажите, что не сработало, чтобы я или другие могли вам помочь. Спасибо. - person Mark Setchell; 15.07.2014