Die read.csv-Warnung 'EOF in Anführungszeichen' verhindert das vollständige Lesen der Datei

125

Ich habe eine CSV-Datei (24,1 MB) , die ich nicht vollständig in meine R-Sitzung einlesen kann. Wenn ich die Datei in einem Tabellenkalkulationsprogramm öffne, werden 112.544 Zeilen angezeigt. Wenn ich es mit in R lese read.csv, erhalte ich nur 56.952 Zeilen und diese Warnung:

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

Ich kann die ganze Datei in R lesen mit readLines:

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

Aber ich kann das nicht als Tabelle (über read.csv) zurück in R bekommen :

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

Wie kann ich diese EOF-Nachricht (die eher ein Fehler als eine Warnung zu sein scheint) lösen oder umgehen, um die gesamte Datei in meine RSitzung aufzunehmen?

Ich habe ähnliche Probleme mit anderen Methoden zum Lesen von CSV-Dateien:

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

Hier ist meine 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
quelle

Antworten:

197

Sie müssen das Angebot deaktivieren.

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

Ich denke, das liegt an dieser Art von Zeilen (siehe "Thorn" und "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
quelle
Danke, das ist eine einfache Lösung. Was halten Sie davon, freadin dieser Situation zu arbeiten? Ich bevorzuge das, weil es viel schneller ist als read.csv. Aber freadscheint kein quoteArgument zu nehmen ..
Ben
1
@Ben Ich habe versucht, es auch ohne Erfolg zum Laufen zu bringen, und wie Sie bereits betont haben, spielt es freadmit eingebetteten Zitaten im Allgemeinen nicht gut, aber ich bin mir sicher, dass es bald eine Problemumgehung geben wird. stackoverflow.com/questions/16094025/…
dickoa
1
Ich hatte 7.000 Zeilen, als ich benutzte write.csv()und bekam 403 mit zurück read.csv(). Durch Hinzufügen von quote = "" habe ich bis zu 410 Zeilen erhalten. read.table()macht es nicht besser. Ich frage mich, was noch versucht werden kann ...
Hack-R
2
Das gleiche Problem wie bei Hack-R: Durch Hinzufügen von quote = "" wurde meine Zeilenanzahl um 30.000 erhöht, aber ich vermisse immer noch über 200.000.
SJDS
1
Könnten Sie bitte eine Zeile schreiben, warum Sie das hinzufügen müssen. (Ich bin ein Python-Programmierer, der versucht, R zu lernen). Ansonsten ist die Antwort perfekt (+1)
Bhargav Rao
10

Ich bin ein neuer R-Benutzer und dachte, ich würde dies posten, falls es jemand anderem hilft. Ich habe versucht, Daten aus einer Textdatei (durch Kommas getrennt) einzulesen, die einige spanische Zeichen enthielt, und es hat ewig gedauert, bis ich es herausgefunden habe. Ich wusste, dass ich UTF-8-Codierung verwenden musste, das Header-Argument auf TRUE setzen musste und dass ich das sep-Argument auf "," setzen musste, aber dann bekam ich immer noch Probleme. Nachdem ich diesen Beitrag gelesen hatte, versuchte ich, das Füllargument auf TRUE zu setzen, bekam dann aber den gleichen "EOF in Anführungszeichen", den ich auf die gleiche Weise wie oben korrigieren konnte. Meine erfolgreiche read.table sieht folgendermaßen aus:

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

Das Ergebnis hat spanischsprachige Zeichen und die gleichen Abmessungen, die ich ursprünglich hatte, also nenne ich es einen Erfolg! Vielen Dank an alle!

mjd876
quelle
6

In der R-Hilfe, wie oben erwähnt, deaktivieren Sie einfach das Zitieren insgesamt, indem Sie einfach Folgendes hinzufügen:

    quote = "" 

zu der read.csv () hat bei mir funktioniert.

Der Fehler "EOF in Zeichenfolge in Anführungszeichen" trat auf mit:

    > 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

In der eingelesenen Datei fehlten 6.619 Zeilen. Aber durch Deaktivieren des Zitierens

    > 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

Arbeitete fehlerfrei und alle Zeilen wurden erfolgreich eingelesen.

Anne Deslattes Mays
quelle
4
Sie wiederholen eine frühere Antwort und lähmen dann ihre Nützlichkeit, indem Sie unnötige flankierende Doppelsternchen innerhalb des Codeblocks hinzufügen.
IRTFM
3

Ich bin auch auf dieses Problem gestoßen und konnte einen ähnlichen EOF-Fehler umgehen, indem ich:

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

Beachten Sie, dass der Trennzeichenparameter im allgemeineren definiert ist read.table().

Tony T.
quelle
2
Hallo, das funktioniert bei mir nicht ... Ich habe einen Fehler Fehler in read.table (". CSV" ,: mehr Spalten als Spaltennamen - scheint, dass das Überspringen (überspringen = 6) nicht richtig funktioniert ...
Maycca
3

Das read.csv()Lesen einer Datei mit Textinhalt ist eigentlich keine gute Idee. Deaktivieren Sie das Anführungszeichen, da quote=""es nur eine vorübergehende Lösung darstellt und nur mit separaten Anführungszeichen funktioniert. Es gibt andere Gründe, die die Warnung verursachen könnten, z. B. einige Sonderzeichen.

Die dauerhafte Lösung (unter Verwendung read.csv()), herauszufinden, was diese Sonderzeichen sind, und einen regulären Ausdruck zu verwenden, um sie zu beseitigen, ist eine Idee.

Haben Sie jemals daran gedacht, das Paket zu installieren {data.table}und fread()zum Lesen der Datei zu verwenden? es ist viel schneller und würde Sie mit dieser EOF-Warnung nicht stören. Beachten Sie, dass die geladene Datei als data.table-Objekt, jedoch nicht als data.frame-Objekt gespeichert wird. Die Klasse data.table hat viele gute Funktionen, aber Sie können sie as.data.frame()bei Bedarf mithilfe von transformieren .

floatsd
quelle
2

Ich hatte das ähnliche Problem: EOF-Warnung und nur ein Teil der Daten wurde mit read.csv () geladen. Ich habe versucht, die Anführungszeichen = "", aber es hat nur die EOF-Warnung entfernt.

Als ich jedoch die erste Zeile betrachtete, die nicht geladen wurde, stellte ich fest, dass sich in einer der Zellen ein Sonderzeichen befand, ein Pfeil → (Hexadezimalwert 0x1A). Nachdem ich den Pfeil gelöscht hatte, wurden die Daten normal geladen.

ElinaJ
quelle
1
Gibt es einen anderen Weg, um dieses Problem ohne manuellen Eingriff zu lösen?
Mohit
2

Ich hatte auch das ähnliche Problem. In meinem Fall war die Ursache des Problems jedoch das Vorhandensein von Apostrophen (dh einfachen Anführungszeichen) in einigen Textwerten. Dies ist besonders häufig bei der Arbeit mit Daten, einschließlich Texten in Französisch, z. B. «L'autre jour».

So ist die Lösung einfach war die Standardeinstellung des Zitats Arguments anzupassen , um die auszuschließen «'» Symbol und somit unter Verwendung quote = ‚\‘ " (dh doppelte Anführungszeichen nur ), alles hat gut funktioniert.

Ich hoffe das kann einigen von euch helfen. Prost.

marQIsoftGuy
quelle
0

Das readr- Paket behebt dieses Problem.

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