L'avviso read.csv 'EOF all'interno della stringa tra virgolette' impedisce la lettura completa del file


125

Ho un file CSV (24,1 MB) che non riesco a leggere completamente nella mia sessione R. Quando apro il file in un programma per fogli di calcolo, vedo 112.544 righe. Quando lo leggo in R con read.csvottengo solo 56.952 righe e questo avviso:

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

Posso leggere l'intero file in R con readLines:

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

Ma non riesco a riportarlo in R come tabella (tramite 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

Come posso risolvere o aggirare questo messaggio EOF (che sembra essere più un errore che un avvertimento) per ottenere l'intero file nella mia Rsessione?

Ho problemi simili con altri metodi di lettura dei file 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")

Ecco la mia sessioneInfo ()

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   

Risposte:


197

Devi disabilitare il preventivo.

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 ...

Penso che sia a causa di questo tipo di linee (selezionare "Spina" e "Meno")

 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,"

Grazie, è una soluzione semplice. Cosa ne pensi di freadlavorare in questa situazione? Lo preferisco perché è molto più veloce di read.csv. Ma freadnon sembra quotediscutere.
Ben

1
@Ben Ho provato a farlo funzionare anche senza successo e come hai sottolineato freadnon funziona bene con le citazioni incorporate in generale, ma sono sicuro che presto ci sarà una soluzione alternativa. stackoverflow.com/questions/16094025/...
dickoa

1
Avevo 7000 file quando l'ho usato write.csv()e ne stavo riprendendo 403 read.csv(). Aggiungi quote = "" mi ha portato fino a 410 righe. read.table()non va meglio. Mi chiedo cos'altro si possa provare ...
Hack-R

2
Stesso problema di Hack-R, l'aggiunta di quote = "" ha aumentato il mio conteggio delle righe di 30.000 ma mi mancano ancora oltre 200.000.
SJDS

1
Potresti scrivere una riga sul motivo per cui è necessario aggiungerlo. (Sono un programmatore Python che cerca di imparare R). Altrimenti la risposta è perfetta (+1)
Bhargav Rao

10

Sono un nuovo utente di R e ho pensato di pubblicarlo nel caso in cui fosse utile a chiunque altro. Stavo cercando di leggere i dati da un file di testo (separato da virgole) che includeva alcuni caratteri spagnoli e mi ci è voluto un sacco di tempo per capirlo. Sapevo che dovevo usare la codifica UTF-8, impostare l'intestazione arg su TRUE e che dovevo impostare il sett arguemnt su ",", ma poi ho ancora problemi. Dopo aver letto questo post ho provato a impostare fill arg su TRUE, ma poi ho ottenuto lo stesso "EOF all'interno della stringa tra virgolette" che sono stato in grado di risolvere allo stesso modo di cui sopra. Il mio read.table di successo si presenta così:

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

Il risultato ha caratteri in lingua spagnola e le stesse attenuazioni che avevo originariamente, quindi lo chiamo successo! Ringrazia tutti!


6

Nella sezione di aiuto R, come sottolineato sopra, disabilitando completamente la quotazione, semplicemente aggiungendo:

    quote = "" 

to read.csv () ha funzionato per me.

L'errore "EOF all'interno della stringa tra virgolette" si è verificato con:

    > 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

E nel file letto mancavano 6.619 righe. Ma disabilitando il preventivo

    > 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

Ha funzionato senza errori e tutte le righe sono state lette correttamente.


4
Stai ripetendo una risposta precedente e quindi paralizzando la sua utilità con l'aggiunta di doppi asterischi laterali non necessari all'interno del blocco di codice.
IRTFM,

3

Ho anche riscontrato questo problema ed ero in grado di aggirare un errore EOF simile usando:

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

Si noti che il parametro separator è definito nel più generale read.table().


2
Ciao, questo non funziona per me ... Ho ricevuto un errore Errore in read.table (". Csv",: più colonne che nomi di colonne - sembra che saltare (skip = 6) non funzioni correttamente ...
Maycca,

3

In realtà, utilizzare read.csv()per leggere un file con contenuto testuale non è una buona idea, disabilitare la citazione poiché set quote=""è solo una soluzione temporanea, ha funzionato solo con virgolette separate. Ci sono altri motivi che potrebbero causare l'avvertimento, come alcuni caratteri speciali.

La soluzione permanente (usare read.csv()), scoprire quali sono quei caratteri speciali e usare un'espressione regolare per eliminarli è un'idea.

Hai mai pensato di installare il pacchetto {data.table}e usarlo fread()per leggere il file. è molto più veloce e non ti disturberà con questo avviso EOF. Si noti che il file caricato verrà archiviato come oggetto data.table ma non come oggetto data.frame. La classe data.table ha molte buone caratteristiche, ma in ogni caso puoi trasformarla usando as.data.frame()se necessario.


2

Ho avuto il problema simile: EOF -warning e solo una parte dei dati veniva caricata con read.csv (). Ho provato le virgolette = "", ma ha rimosso solo EOF -warning.

Ma guardando la prima riga che non si stava caricando, ho scoperto che c'era un carattere speciale, una freccia → (valore esadecimale 0x1A) in una delle celle. Dopo aver eliminato la freccia ho ottenuto il caricamento normale dei dati.


1
stesso problema, c'è un altro modo per risolverlo, senza alcun intervento manuale?
Mohit,

2

Anch'io ho avuto il problema simile. Ma nel mio caso, la causa del problema era dovuta alla presenza di apostrofi (ovvero virgolette singole) all'interno di alcuni dei valori di testo. Ciò è particolarmente frequente quando si lavora con dati che includono testi in francese, ad esempio «L'autre jour».

Quindi, la soluzione era semplicemente quella di regolare l'impostazione predefinita dell'argomento quote per escludere il simbolo «'», e quindi, usando quote = "\" " (cioè solo virgolette doppie ), tutto ha funzionato bene.

Spero che ciò possa aiutare alcuni di voi. Saluti.


0

Il pacchetto readr risolverà questo problema.

install.packages('readr')
library(readr)
readr::read_csv('yourfile.csv')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.