La advertencia de read.csv 'EOF dentro de la cadena entre comillas' impide la lectura completa del archivo


125

Tengo un archivo CSV (24.1 MB) que no puedo leer completamente en mi sesión de R. Cuando abro el archivo en un programa de hoja de cálculo, puedo ver 112.544 filas. Cuando lo leo en R con read.csvsolo obtengo 56,952 filas y esta advertencia:

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

Puedo leer todo el archivo en R con readLines:

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

Pero no puedo devolver esto a R como una tabla (vía 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

¿Cómo puedo resolver o solucionar este mensaje EOF (que parece ser más un error que una advertencia) para obtener el archivo completo en mi Rsesión?

Tengo problemas similares con otros métodos de lectura de archivos 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")

Aquí está mi sessionInfo ()

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   

Respuestas:


197

Necesita deshabilitar las citas.

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

Creo que es por este tipo de líneas (marque "Thorn" y "Minus")

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

Gracias, esa es una solución fácil. ¿Qué opinas sobre freadtrabajar en esta situación? Prefiero eso porque es mucho más rápido que read.csv. Pero freadno parece tener una quotediscusión ..
Ben

1
@Ben Traté de hacer que funcione también sin éxito y, como usted señaló fread, no funciona bien con una cita incrustada en general, pero estoy seguro de que pronto habrá una solución. stackoverflow.com/questions/16094025/…
dickoa 01 de

1
Tenía 7,000 filas cuando las usaba write.csv()y estaba recuperando 403 read.csv(). Agregar quote = "" me llevó hasta 410 filas. read.table()no hace mejor Me pregunto qué más se puede probar ...
Hack-R

2
El mismo problema que Hack-R, agregar quote = "" aumentó mi recuento de filas en 30,000 pero todavía me faltan más de 200,000.
SJDS

1
¿Podría por favor escribir una línea de por qué necesita agregar eso? (Soy un programador de Python que intenta aprender R). De lo contrario, la respuesta es perfecta (+1)
Bhargav Rao

10

Soy un nuevo usuario de R y pensé en publicar esto en caso de que ayude a alguien más. Estaba tratando de leer datos de un archivo de texto (separado por comas) que incluía algunos caracteres en español y me llevó una eternidad descubrirlo. Sabía que tenía que usar la codificación UTF-8, establecer el argumento de encabezado en VERDADERO, y que necesitaba establecer el argumento de sep en ",", pero aún así tuve problemas. Después de leer esta publicación , intenté establecer el argumento de relleno en TRUE, pero luego obtuve el mismo "EOF dentro de la cadena citada" que pude arreglar de la misma manera que arriba. Mi read.table exitosa se ve así:

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

El resultado tiene caracteres en español y los mismos colores que tenía originalmente, ¡así que lo llamo un éxito! ¡Gracias a todos!


6

En la sección de ayuda de R, como se señaló anteriormente, simplemente deshabilita las citas, simplemente agregando:

    quote = "" 

al read.csv () funcionó para mí.

El error, "EOF dentro de la cadena entre comillas", ocurrió 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

Y en el archivo leído faltaban 6.619 líneas. Pero al deshabilitar las citas

    > 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

Funcionó sin error y todas las líneas se leyeron con éxito.


44
Está repitiendo una respuesta anterior y luego paralizando su utilidad mediante la adición de asteriscos dobles flanqueantes innecesarios dentro del bloque de código.
IRTFM

3

También me encontré con este problema y pude solucionar un error EOF similar usando:

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

Observe que el parámetro separador se define dentro del más general read.table().


2
Hola, esto no funciona para mí ... Recibí un error Error en read.table (". Csv",: más columnas que nombres de columnas; parece que omitir (skip = 6) no funciona correctamente ...
maycca

3

En realidad, usar read.csv()para leer un archivo con contenido de texto no es una buena idea, deshabilitar la cita como conjunto quote=""es solo una solución temporal, solo funcionó con comillas separadas. Hay otras razones que causarían la advertencia, como algunos caracteres especiales.

La solución permanente (usar read.csv()), descubrir cuáles son esos caracteres especiales y usar una expresión regular para eliminarlos es una idea.

¿Alguna vez pensó en instalar el paquete {data.table}y utilizarlo fread()para leer el archivo? es mucho más rápido y no te molestaría con esta advertencia EOF. Tenga en cuenta que el archivo que carga se almacenará como un objeto data.table pero no como un objeto data.frame. La clase data.table tiene muchas características buenas, pero de todos modos, puede transformarla usando as.data.frame()si es necesario.


2

Tuve el problema similar: advertencia EOF y solo parte de los datos se estaba cargando con read.csv (). Intenté las comillas = "", pero solo eliminó la advertencia EOF.

Pero al observar la primera fila que no se estaba cargando, descubrí que había un carácter especial, una flecha → (valor hexadecimal 0x1A) en una de las celdas. Después de eliminar la flecha, obtuve los datos para cargar normalmente.


1
mismo problema, ¿hay otra forma de resolver esto, sin ninguna intervención manual?
Mohit

2

Yo también tuve el problema similar. Pero en mi caso, la causa del problema se debió a la presencia de apóstrofes (es decir, comillas simples) dentro de algunos de los valores de texto. Esto es especialmente frecuente cuando se trabaja con datos que incluyen textos en francés, por ejemplo, «L'autre jour».

Por lo tanto, la solución era simplemente para ajustar la configuración por defecto del argumento cita para excluir la «'» símbolo, y por lo tanto, el uso de quote = '\' " (es decir, el doble comilla única ), todo funcionaba bien.

Espero que pueda ayudar a algunos de ustedes. Salud.


0

El paquete de lectura solucionará este problema.

install.packages('readr')
library(readr)
readr::read_csv('yourfile.csv')
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.