web-dev-qa-db-fra.com

un avertissement read.csv 'EOF entre guillemets' empêche la lecture complète du fichier

J'ai un fichier CSV (24,1 Mo) que je ne peux pas lire complètement 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 en R avec readLines:

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

Mais je ne peux pas récupérer cela dans R sous forme de tableau (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) pour obtenir le fichier entier dans ma session R?

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   
117
Ben

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 (cocher "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,"
181
dickoa

Comme indiqué ci-dessus, dans la section d'aide R, désactivez simplement la citation en ajoutant simplement:

    quote = "" 

à read.csv () a travaillé pour moi. 

L'erreur "EOF dans la chaîne citée" 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

Travaillé sans erreur et toutes les lignes ont été lues avec succès. 

4
Anne Deslattes Mays

En fait, utiliser read.csv() pour lire un fichier contenant du texte n'est pas une bonne idée, désactiver le guillemet car set quote="" n'est qu'une solution temporaire, cela fonctionnait uniquement avec des guillemets distincts. Il y a d'autres raisons qui pourraient provoquer l'avertissement, telles que certains caractères spéciaux. 

La solution permanente (à l'aide de read.csv()), découvrir quels sont ces caractères spéciaux et utiliser une expression régulière pour les éliminer, est une idée.

Avez-vous déjà pensé à installer le paquet {data.table} et à utiliser fread() pour lire le fichier? il est beaucoup plus rapide et ne vous dérangerait pas avec cet avertissement EOF. Notez que le fichier qu'il charge sera stocké en tant qu'objet data.table mais pas en tant qu'objet data.frame. La classe data.table possède de nombreuses fonctionnalités intéressantes, mais vous pouvez quand même la transformer à l'aide de as.data.frame() si nécessaire.

3
floatsd

J'ai également rencontré ce problème et j'ai pu contourner une erreur EOF similaire en utilisant:

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

Notez que le paramètre separator est défini dans la fonction plus générale read.table().

2
Tony T

J'ai eu le problème similaire: EOF -warning et seule une partie des données se chargeait de read.csv (). J'ai essayé les guillemets = "", mais cela n'a supprimé que le EOF -warning.

Mais en regardant la première ligne qui ne se charge pas, j'ai trouvé qu'il y avait un caractère spécial, une flèche → (valeur hexadécimale 0x1A) dans l'une des cellules. Après avoir supprimé la flèche, les données se chargeaient normalement.

1
ElinaJ

Moi aussi j'ai eu le même problème. Mais dans mon cas, la cause du problème était due à la présence d’apostrophes (c.-à-d. Des guillemets simples) dans certaines des valeurs de texte. Ceci est particulièrement fréquent lorsque vous travaillez 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 pour exclure le symbole «'», et donc, à l’aide de quote = "\" "(c.-à-d. Guillemet double seulement ), tout a bien fonctionné.

J'espère que cela peut aider certains d'entre vous. À votre santé.

0
marQIsoftGuy