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

125

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. Quand je le lis dans R avec, read.csvje 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 tout le fichier en R avec readLines:

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

Mais je ne peux pas le ramener dans R en tant que 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) pour obtenir le fichier entier dans ma Rsession?

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 ma 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   
Ben
la source

Réponses:

197

Vous devez désactiver les devis.

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 (cochez «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,"
Dickoa
la source
Merci, c'est une solution facile. Maintenant, que pensez-vous de freadtravailler dans cette situation? Je préfère ça parce que c'est beaucoup plus rapide que read.csv. Mais freadne semble pas accepter d' quoteargument.
Ben
1
@Ben J'ai essayé de le faire fonctionner aussi sans succès et comme vous l'avez souligné, freadcela ne fonctionne pas bien avec les citations intégrées en général, mais je suis sûr qu'il y aura bientôt une solution de contournement. stackoverflow.com/questions/16094025/…
dickoa
1
J'avais 7 000 lignes quand j'utilisais write.csv()et j'en récupérais 403 read.csv(). L'ajout de quote = "" m'a permis d'obtenir jusqu'à 410 lignes. read.table()ne fait pas mieux. Je me demande quoi d'autre peut être essayé ...
Hack-R
2
Même problème que Hack-R, l'ajout de quote = "" a augmenté mon nombre de lignes de 30 000 mais il me manque encore plus de 200 000.
SJDS
1
Pourriez-vous s'il vous plaît écrire une ligne expliquant pourquoi vous devez ajouter cela. (Je suis un programmeur Python essayant d'apprendre R). Sinon, la réponse est parfaite (+1)
Bhargav Rao
10

Je suis un nouvel utilisateur de R et j'ai pensé publier ceci au cas où cela aiderait quelqu'un d'autre. J'essayais de lire des données à partir d'un fichier texte (séparé par des virgules) contenant quelques caractères espagnols et il m'a fallu une éternité pour le comprendre. Je savais que je devais utiliser l'encodage UTF-8, définir l'argument d'en-tête sur TRUE, et que je devais régler l'argument sep sur ",", mais j'ai quand même eu des raccrochages. Après avoir lu cet article, j'ai essayé de définir l'argument de remplissage sur TRUE, mais j'ai ensuite obtenu le même "EOF dans la chaîne entre guillemets" que j'ai pu corriger de la même manière que ci-dessus. Ma table de lecture réussie 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 a tous!

mjd876
la source
6

Dans la section d'aide R, comme indiqué ci-dessus, désactivez simplement les guillemets, en ajoutant simplement:

    quote = "" 

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

L'erreur "EOF dans la chaîne entre guillemets" 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 le fichier lu manquait 6 619 lignes. Mais en désactivant les citations

    > 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

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

Anne Deslattes Mays
la source
4
Vous répétez une réponse précédente, puis paralysez son utilité par l'ajout de doubles astérisques flanquants inutiles à l'intérieur du bloc de code.
IRTFM
3

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 de séparation est défini dans le plus général read.table().

Tony T
la source
2
Salut, cela ne fonctionne pas pour moi ... J'ai eu une erreur Erreur dans read.table (". Csv",: plus de colonnes que de noms de colonnes - semble que sauter (skip = 6) ne fonctionne pas correctement ...
maycca
3

En fait, utiliser read.csv()pour lire un fichier avec un contenu texte n'est pas une bonne idée, désactiver le guillemet comme défini quote=""n'est qu'une solution temporaire, cela ne fonctionnait qu'avec des guillemets séparés. Il y a d'autres raisons qui pourraient provoquer l'avertissement, comme certains caractères spéciaux.

La solution permanente (utiliser read.csv()), découvrir ce que 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 package {data.table}et à l'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 a de nombreuses fonctionnalités intéressantes, mais de toute façon, vous pouvez la transformer en utilisant as.data.frame()si nécessaire.

floatsd
la source
2

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

Mais en regardant la première ligne qui ne se chargeait 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 chargent normalement.

ElinaJ
la source
1
même problème, y a-t-il un autre moyen de résoudre ce problème, sans aucune intervention manuelle?
Mohit
2

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.-à-d. 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».

Donc, la solution était simplement d'ajuster le paramètre par défaut de l'argument quote pour exclure le symbole «'», et donc, en utilisant quote = "\" " (c'est-à-dire guillemets doubles uniquement ), tout fonctionnait bien.

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

marQIsoftGuy
la source
0

Le package readr résoudra ce problème.

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