попередження read.csv 'EOF у цитованому рядку' запобігає повному читанню файлу


125

У мене є файл CSV (24,1 Мб), який я не можу повністю прочитати під час сеансу R. Коли я відкриваю файл у програмі електронних таблиць, я бачу 112 534 рядків. Коли я читаю його на R, read.csvя отримую лише 56952 рядків, і це попередження:

cit <- read.csv("citations.CSV", row.names = NULL, 
                comment.char = "", header = TRUE, 
                stringsAsFactors = FALSE,  
                colClasses= "character", encoding= "utf-8")

Warning message:
In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  EOF within quoted string

Я можу прочитати весь файл у R за допомогою readLines:

rl <- readLines(file("citations.CSV", encoding = "utf-8"))
length(rl)
[1] 112545

Але я не можу повернути це в R як таблицю (через read.csv):

write.table(rl, "rl.txt", quote = FALSE, row.names = FALSE)
rl_in <- read.csv("rl.txt", skip = 1, row.names = NULL)

Warning message:
In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  EOF within quoted string

Як я можу вирішити або подолати це повідомлення EOF (яке, здається, більше помилки, ніж попередження), щоб отримати весь файл у Rсеанс?

У мене є подібні проблеми з іншими методами читання файлів CSV:

require(sqldf)
cit_sql <- read.csv.sql("citations.CSV", sql = "select * from file")
require(data.table)
cit_dt <- fread("citations.CSV")
require(ff)
cit_ff <- read.csv.ffdf(file="citations.CSV")

Ось моя сесіяInfo ()

R version 3.0.1 (2013-05-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] tools     tcltk     stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ff_2.2-11             bit_1.1-10            data.table_1.8.8      sqldf_0.4-6.4        
 [5] RSQLite.extfuns_0.0.1 RSQLite_0.11.4        chron_2.3-43          gsubfn_0.6-5         
 [9] proto_0.3-10          DBI_0.2-7   

Відповіді:


197

Потрібно відключити цитування.

cit <- read.csv("citations.CSV", quote = "", 
                 row.names = NULL, 
                 stringsAsFactors = FALSE)

str(cit)
## 'data.frame':    112543 obs. of  13 variables:
##  $ row.names    : chr  "10.2307/675394" "10.2307/30007362" "10.2307/4254931" "10.2307/20537934" ...
##  $ id           : chr  "10.2307/675394\t" "10.2307/30007362\t" "10.2307/4254931\t" "10.2307/20537934\t" ...
##  $ doi          : chr  "Archaeological Inference and Inductive Confirmation\t" "Sound and Sense in Cath Almaine\t" "Oak Galls Preserved by the Eruption of Mount Vesuvius in A.D. 79_ and Their Probable Use\t" "The Arts Four Thousand Years Ago\t" ...
##  $ title        : chr  "Bruce D. Smith\t" "Tomás Ó Cathasaigh\t" "Hiram G. Larew\t" "\t" ...
##  $ author       : chr  "American Anthropologist\t" "Ériu\t" "Economic Botany\t" "The Illustrated Magazine of Art\t" ...
##  $ journaltitle : chr  "79\t" "54\t" "41\t" "1\t" ...
##  $ volume       : chr  "3\t" "\t" "1\t" "3\t" ...
##  $ issue        : chr  "1977-09-01T00:00:00Z\t" "2004-01-01T00:00:00Z\t" "1987-01-01T00:00:00Z\t" "1853-01-01T00:00:00Z\t" ...
##  $ pubdate      : chr  "pp. 598-617\t" "pp. 41-47\t" "pp. 33-40\t" "pp. 171-172\t" ...
##  $ pagerange    : chr  "American Anthropological Association\tWiley\t" "Royal Irish Academy\t" "New York Botanical Garden Press\tSpringer\t" "\t" ...
##  $ publisher    : chr  "fla\t" "fla\t" "fla\t" "fla\t" ...
##  $ type         : logi  NA NA NA NA NA NA ...
##  $ reviewed.work: logi  NA NA NA NA NA NA ...

Я думаю, що через такі рядки (позначте "Шип" і "Мінус")

 readLines("citations.CSV")[82]
[1] "10.2307/3642839,10.2307/3642839\t,\"Thorn\" and \"Minus\" in Hieroglyphic Luvian Orthography\t,H. Craig Melchert\t,Anatolian Studies\t,38\t,\t,1988-01-01T00:00:00Z\t,pp. 29-42\t,British Institute at Ankara\t,fla\t,\t,"

Дякую, це легко виправити. Тепер, що ви думаєте про freadроботу в цій ситуації? Я вважаю за краще, тому що це набагато швидше, ніж read.csv. Але fread, схоже, не бере quoteаргументу.
Бен

1
@Ben я намагався змусити його працювати теж без успіху, і, як ви вказали, freadне вдається добре вбудовуватися цитатою в цілому, але я впевнений, що скоро буде вирішення проблеми. stackoverflow.com/questions/16094025 / ...
dickoa

1
У мене було 7000 рядків, коли я використовував write.csv()і отримував 403 назад read.csv(). Додавання quo = "" отримало мене до 410 рядків. read.table()не краще. Цікаво, що ще можна спробувати ...
Hack-R

2
Та ж проблема, що і Hack-R, додавши quo = "" збільшив кількість моїх рядків на 30 000, але я все ще пропускаю понад 200 000.
SJDS

1
Скажіть, будь ласка, рядок про те, чому вам потрібно це додати. (Я програміст Python, який намагається вивчити R). Інакше відповідь ідеальна (+1)
Bhargav Rao

10

Я новий користувач R і думав, що опублікую це, якщо це допоможе комусь іншому. Я намагався прочитати дані з текстового файлу (розділеного комами), який містив кілька іспанських символів, і мені це знадобилося назавжди розібратися. Я знав, що мені потрібно використовувати кодування UTF-8, встановити аргумент заголовка на TRUE, і що мені потрібно встановити аргумент sep на ",", але тоді я все-таки отримав призупинення. Прочитавши цю публікацію, я спробував встановити аргумент заповнення на TRUE, але потім отримав той самий "EOF у цитованому рядку", який я зміг виправити таким же чином, як і вище. Мій успішний читальний стіл виглядає так:

target <- read.table("target2.txt", fill=TRUE, header=TRUE, quote="", sep=",", encoding="UTF-8")

В результаті є символи іспанської мови та такі ж тьмяні кольори, які у мене були спочатку, тому я називаю це успіхом! Дякую усім!


6

У розділі довідки R, як було зазначено вище, просто відключіть цитування, просто додавши:

    quote = "" 

до read.csv () працював на мене.

Помилка "EOF у цитованому рядку" сталася з:

    > iproscan.53A.neg     = read.csv("interproscan.53A.neg.n.csv",
    +                        colClasses=c(pb.id      = "character",
    +                                     genLoc     = "character",
    +                                     icode      = "character",
    +                                     length     = "character",
    +                                     proteinDB  = "character",
    +                                     protein.id = "character",
    +                                     prot.desc  = "character",
    +                                     start      = "character",
    +                                     end        = "character",
    +                                     evalue     = "character",
    +                                     tchar      = "character",
    +                                     date       = "character",
    +                                     ipro.id    = "character",
    +                                     prot.name  = "character",
    +                                     go.cat     = "character",
    +                                     reactome.id= "character"),
    +                                     as.is=T,header=F)
    Warning message:
    In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
      EOF within quoted string
    > dim(iproscan.53A.neg)
    [1] 69383    16

А в прочитаному файлі бракувало 6 619 рядків. Але відключивши цитування

    > iproscan.53A.neg     = read.csv("interproscan.53A.neg.n.csv",
    +                        colClasses=c(pb.id      = "character",
    +                                     genLoc     = "character",
    +                                     icode      = "character",
    +                                     length     = "character",
    +                                     proteinDB  = "character",
    +                                     protein.id = "character",
    +                                     prot.desc  = "character",
    +                                     start      = "character",
    +                                     end        = "character",
    +                                     evalue     = "character",
    +                                     tchar      = "character",
    +                                     date       = "character",
    +                                     ipro.id    = "character",
    +                                     prot.name  = "character",
    +                                     go.cat     = "character",
    +                                     reactome.id= "character"),
    +                                     as.is=T,header=F,**quote=""**)    
    > 
    > dim(iproscan.53A.neg)
    [1] 76002    16

Працювали без помилок, і всі рядки були успішно прочитані.


4
Ви повторюєте попередню відповідь, а потім калічите її корисність, додавши непотрібні флангові подвійні зірочки всередині кодового блоку.
IRTFM

3

Я також зіткнувся з цією проблемою і зміг подолати подібну помилку EOF, використовуючи:

read.table("....csv", sep=",", ...)

Зауважте, що параметр розділювача визначений у більш загальному read.table().


2
Привіт, це не працює для мене ... Я отримав помилку Помилка read.table (". Csv",: більше стовпців, ніж назви стовпців - здається, що пропуск (skip = 6) працює не правильно ...
майкка

3

Власне, read.csv()для читання файлу з текстовим вмістом не дуже гарна ідея, відключити цитату як встановлене quote=""є лише тимчасовим рішенням, вона працювала лише з Окремими лапками. Існують й інші причини, які викликають попередження, наприклад деякі спеціальні символи.

Постійне рішення (за допомогою read.csv()), з'ясування того, що це за спеціальні символи, та використання регулярного виразу для їх усунення - це ідея.

Ви коли-небудь думали про встановлення пакету {data.table}та використання fread()для читання файлу. це набагато швидше і не заважає вам цим попередженням EOF. Зауважте, що завантажений ним файл буде зберігатися як об’єкт data.table, але не як об'єкт data.frame. Клас data.table має безліч хороших функцій, але все одно, ви можете перетворити його, використовуючи, as.data.frame()якщо це необхідно.


2

У мене була схожа проблема: EOF-попередження, і лише частина даних завантажувалася з read.csv (). Я спробував лапки = "", але це лише зняло попередження EOF.

Але переглянувши перший рядок, який не завантажувався, я виявив, що в одній із комірок є спеціальний символ - стрілка → (шістнадцяткове значення 0x1A). Після видалення стрілки я отримав дані для нормального завантаження.


1
та ж проблема, чи є інший спосіб вирішити це без будь-якого вручного втручання?
Мохіт

2

У мене теж була подібна проблема. Але в моєму випадку причина проблеми була через наявність апострофів (тобто єдиних лапок) у межах деяких текстових значень. Це особливо часто при роботі з даними, включаючи тексти французькою мовою, наприклад, «L'autre jour».

Таким чином, рішення було просто змінити стандартні настройки цитатою аргументу для виключення « '» символ, і , таким чином, використовуючи цитату = "\" " (тобто подвійної лапки тільки ), все працювало відмінно.

Я сподіваюся, що хтось із вас може допомогти. Ура.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.