149 votes

read.csv warning 'EOF within quoted string' empêche la lecture complète du fichier

J'ai un fichier CSV (24.1 MB) que je ne peux pas lire entièrement dans ma session R. Lorsque j'ouvre le fichier dans un tableur, je peux voir 112 544 lignes. Lorsque je le lis dans R avec read.csv Je n'obtiens que 56 952 lignes et cet avertissement :

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

Je peux lire le fichier entier dans R avec readLines :

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

Mais je n'arrive pas à le récupérer dans R comme une table (via 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

Comment puis-je résoudre ou contourner ce message EOF (qui semble être plus une erreur qu'un avertissement) afin d'obtenir le fichier entier dans mon système d'exploitation ? R session ?

J'ai des problèmes similaires avec d'autres méthodes de lecture de fichiers 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")

Voici mon 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

227voto

dickoa Points 7851

Vous devez désactiver la citation.

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

Je pense que c'est à cause de ce genre de lignes (voir "Thorn" et "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,"

13voto

mjd876 Points 143

Je suis un nouvel utilisateur de R et j'ai pensé poster ceci au cas où cela aiderait quelqu'un d'autre. J'essayais de lire les données d'un fichier texte (séparées par des virgules) qui comprenait quelques caractères espagnols et cela m'a pris une éternité pour trouver la solution. Je savais que je devais utiliser le codage UTF-8, mettre l'argument header à TRUE, et que je devais mettre l'argument sep à ",", mais j'avais toujours des problèmes. Après avoir lu cet article J'ai essayé de mettre l'argument fill à TRUE, mais j'ai obtenu le même "EOF within quoted string" que j'ai pu corriger de la même manière que ci-dessus. Mon read.table réussi ressemble à ceci :

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

Le résultat a des caractères en espagnol et les mêmes dims que j'avais à l'origine, donc je l'appelle un succès ! Merci à tous !

7voto

Dans la section d'aide de R, comme indiqué ci-dessus, il suffit de désactiver complètement la citation, en ajoutant simplement :

    quote = "" 

au read.csv() a fonctionné pour moi.

L'erreur, "EOF within quoted string", s'est produite avec :

    > 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

Et il manquait 6 619 lignes dans le fichier lu. Mais en désactivant la citation

    > 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

Cela a fonctionné sans erreur et toutes les lignes ont été lues avec succès.

5voto

marQIsoftGuy Points 41

J'ai aussi eu le même problème. Mais dans mon cas, la cause du problème était due à la présence d'apostrophes (c'est-à-dire de guillemets simples) dans certaines valeurs de texte. Cela est particulièrement fréquent lorsque l'on travaille avec des données comprenant des textes en français, par exemple "L'autre jour".

La solution consistait donc simplement à ajuster le paramètre par défaut de l'argument quote afin d'exclure le symbole "'", et ainsi, en utilisant la commande citation = "\"" (c'est-à-dire entre guillemets) seulement ), tout a bien fonctionné.

J'espère que cela pourra aider certains d'entre vous. A la vôtre.

5voto

vladiim Points 734

El lecteur corrigera ce problème.

install.packages('readr')
library(readr)
readr::read_csv('yourfile.csv')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X