2013-07-01 9 views
104

Ich habe a CSV file (24.1 MB), die ich nicht vollständig in meine R-Sitzung einlesen kann. Wenn ich die Datei in einem Tabellenkalkulationsprogramm öffne, kann ich 112.544 Zeilen sehen. Wenn ich es in R mit read.csv lesen erhalte ich nur 56.952 Zeilen und diese Warnung:read.csv warning 'EOF innerhalb der Zeichenfolge in Anführungszeichen' verhindert das vollständige Lesen der Datei

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

Aber ich kann nicht erhalten diese zurück:

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 die ganze Datei in R mit readLines lesen in R als Tabelle (über 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 

wie kann ich lösen oder Abhilfe dieses EOF-Nachricht, die ganze (was eher ein Fehler als eine Warnung zu sein scheint) Datei in meine R Sitzung?

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 Session()

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 

Antwort

154

Sie unter Angabe deaktivieren müssen.

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, ist wegen dieser Art von Linien (Check „Dorn“ 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," 
+0

Danke, das ist eine einfache Lösung. Was denkst du darüber, wie "Freed" in dieser Situation funktioniert? Ich bevorzuge das, weil es viel schneller ist als 'read.csv'. Aber "fread" scheint kein "Quote" -Argument zu haben. – Ben

+1

@Ben Ich habe versucht, es auch ohne Erfolg funktionieren zu lassen und wie du darauf hingewiesen hast, "fread" spielt nicht gut mit eingebetteten Zitaten im Allgemeinen, aber ich bin mir sicher, dass es bald eine Abhilfe geben wird. http://stackoverflow.com/questions/16094025/data-tablefread-and-unbalanced – dickoa

+0

Ich sehe, vielen Dank für die Überprüfung. – Ben

2

ich auch in dieses Problem lief, und konnte um einen ähnlichen EOF Fehler arbeiten Verwendung:

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

bemerken, dass der Abscheider Parameter innerhalb der allgemeineren read.table() definiert ist.

+0

Hallo, das funktioniert nicht für mich ... Ich habe einen Fehler Error in read.table (". Csv",: mehr Spalten als Spaltennamen - scheint, dass das Überspringen (Skip = 6) nicht richtig funktioniert. .. – maycca

1

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 entfernt nur die EOF - Warnung.

Aber in der ersten Zeile, die nicht geladen wurde, fand ich, dass es ein spezielles Zeichen, einen Pfeil → (Hexadezimalwert 0x1A) in einer der Zellen gab. Nach dem Löschen des Pfeils habe ich die Daten normal geladen.

+0

das gleiche Problem, gibt es eine andere Möglichkeit, dies zu lösen, ohne manuellen Eingriff? – Mohit

4

Im Hilfe-Bereich R, wie oben erwähnt, eine Behinderung nur ganz zu zitieren, indem einfach:

quote = "" 

zum read.csv() arbeitete für mich.

Der Fehler "EOF innerhalb Zeichenfolge in Anführungszeichen", trat 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 

Und die Datei lesen in 6619 Zeilen fehlte. Aber durch das Deaktivieren zitiert

> 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 

ohne Fehler gearbeitet und alle Leitungen wurden erfolgreich eingelesen.

+4

Sie wiederholen eine frühere Antwort und dann lähmt ihr Dienstprogramm durch das Hinzufügen von unnötigen flankierenden Doppelsternchen innerhalb des Codeblocks. –

6

ich einen neuen-ish R Benutzer bin und dachten, ich würde schreibe dies im Fall hilft es jemand anderes.Ich habe versucht, Daten aus einer Textdatei (getrennt durch Kommas) einzulesen, die ein paar spanische Zeichen enthielt, und ich brauchte ewig, um es herauszufinden. Ich wusste, dass ich UTF-8-Codierung verwenden musste, setze das Header-Argument auf TRUE, und dass ich den sep-Argument auf "," setzen muss, aber dann habe ich immer noch aufgelegt. After reading this post Ich habe versucht, die Füllung Arg auf TRUE, aber dann bekam die gleiche "EOF innerhalb der Zeichenfolge in Anführungszeichen", die ich in der gleichen Weise wie oben beheben konnte. Meine erfolgreiche read.table sieht wie folgt aus:

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

Das Ergebnis Spanisch Sprachzeichen und gleiche dims Ich hatte ursprünglich, also bin ich nannte es ein Erfolg! Danke allen!

2

Eigentlich read.csv() verwenden, um eine Datei mit Textinhalt zu lesen, ist keine gute Idee, deaktivieren Sie das Zitat als gesetzt quote = "" ist nur eine temporäre Lösung, es funktionierte nur mit getrennten Anführungszeichen. Es gibt andere Gründe, die die Warnung zum Beispiel einige Sonderzeichen verursachen würden.

Bei diesen Fällen mit Sonderzeichen besteht die dauerhafte Lösung darin, Ihre Datei zu überprüfen, um herauszufinden, was diese Sonderzeichen sind, und sie mit regulärem Ausdruck zu beseitigen.

Haben Sie jemals daran gedacht, das Paket {data.table} zu installieren und fread() zu verwenden, um die Datei zu lesen. es ist viel schneller und würde Sie mit dieser EOF-Warnung nicht stören. Beachten Sie, dass Sie die Datei, die es einlesen ist keine Klasse data.frame, data.table
hat viele gute Funktionen, aber Sie könnten es ändern, indem Sie as.data.frame() bei Bedarf verwenden.