Warnung "Unvollständige letzte Zeile" beim Versuch, eine CSV-Datei in R einzulesen

114

Ich versuche, eine CSV-Datei in R zu lesen und diese Formel zu verwenden:

pheasant<-read.table(file.choose(),header=TRUE,sep=",")

Ich erhalte diese Warnmeldung:

"incomplete final line found by readTableHeader on 'C:\Documents and Settings..."

Es gibt ein paar Dinge, von denen ich dachte, dass sie diese Warnung verursacht haben könnten, aber leider weiß ich nicht genug über R, um das Problem selbst zu diagnostizieren, also dachte ich, ich würde hier posten, in der Hoffnung, dass jemand anderes es für mich diagnostizieren kann!

  • Die CSV-Datei war ursprünglich eine Excel-Datei, die ich im CSV-Format gespeichert habe
  • Die Datei enthält drei Datenspalten
  • Jede Datenspalte hat eine unterschiedliche Länge, dh es gibt eine unterschiedliche Anzahl von Werten in jeder Spalte
  • Ich möchte die Mittelwerte (unter Verwendung eines t-Tests oder eines Äquivalents in Abhängigkeit von der Normal- / Nicht-Normalverteilung) von zwei Spalten gleichzeitig vergleichen, also zum Beispiel einen t-Test zwischen den Werten von Spalte 1 und den Werten von Spalte 2, dann einen t- Test der Werte von Spalte 1 und Spalte 3 usw.

Jede Hilfe oder Anregungen wäre sehr dankbar!

Kate
quelle
1
@ Kate: Könntest du uns mit der Datei selbst verknüpfen? Ich habe einige Ideen, aber es ist schwierig zu sagen, um welches Problem es sich handelt, ohne die Datei zu haben.
Joris Meys
Hallo Joris - Ich bin nicht sicher, wie ich das machen soll, sorry ...
Kate
Die erste Spalte hat 1045 Werte, die zweite hat 623 Werte und die dritte hat 871, wenn das hilft ...? Sie sind alle numerische Werte in ganzen und halben Zahlen, dh 23, 24,5 usw.
Kate
1
Ich denke, das ist das Problem, weil read.table Ihre Daten in einen Datenrahmen legt, der gleiche Spaltenlängen haben muss.
Sir Ksilem
1
@ James: Nein, das ist es nicht. readTableHead (die zugrunde liegende c-Funktion) liest die ersten 5 Zeilen. Der Fehler entsteht dort.
Joris Meys

Antworten:

134

Die Nachricht zeigt an, dass die letzte Zeile der Datei nicht mit einem EOL-Zeichen (Line Of Feed) (Zeilenvorschub ( \n) oder Wagenrücklauf + Zeilenvorschub ( \r\n)) endet . Die ursprüngliche Absicht dieser Nachricht war es, Sie zu warnen, dass die Datei möglicherweise unvollständig ist. Die meisten Datendateien haben ein EOL-Zeichen als letztes Zeichen in der Datei.

Das Mittel ist einfach:

  1. Öffne die Datei
  2. Navigieren Sie zur allerletzten Zeile der Datei
  3. Platzieren Sie den Cursor am Ende dieser Zeile
  4. Drücken Sie return
  5. Speicher die Datei
Hendrik Pon
quelle
2
Es ist nicht die letzte Zeile der Datei. Es ist der Header, den er liest, das sind Ihre ersten fünf Zeilen.
Joris Meys
@JorisMeys Die Fehlermeldung bezieht sich jedoch auf die letzte Zeile der Datei. Wenn Sie die obigen Schritte ausführen, wird die Warnung tatsächlich entfernt.
WorldGov
@WorldGov "unvollständige letzte Zeile" ist eine Warnung (kein Fehler), die aufgrund verschiedener Ursachen angezeigt werden kann. In Ihrem Fall fehlt eine endgültige EOL. In Ihrem Fall wurde die Warnung auf keinen Fall von der Funktion readTableHeader ausgelöst, da diese die letzte Zeile nicht liest. Daher ist Ihr Problem nicht dasselbe wie das des OP.
Joris Meys
20

Das Problem ist leicht zu lösen. Es ist, weil die letzte Zeile leer sein muss.

Sagen Sie, wenn Ihr Inhalt ist

line 1,
line2

ändere es auf

line 1,
line2
(empty line here)

Heute bin ich auf dieses Problem gestoßen, als ich versucht habe, mit R eine JSON-Datei zu lesen, indem ich den folgenden Befehl verwendet habe:

json_data<-fromJSON(paste(readLines("json01.json"), collapse=""))

;; und ich löse es durch meine obige Methode.

Vincent Jia
quelle
1
Mit Klempner zum Hosten einer R-API hatte ich das gleiche Problem. Warning message: In readLines(file) : incomplete final line found on 'apiAnaheim.R'Die Warnung wurde behoben, indem am Ende eine leere Zeile hinzugefügt wurde. Ich bin mir nicht sicher, warum das passiert.
HoofarLotusX
Hier gilt das gleiche. Vielen Dank.
Megadeth
14

Sind Sie wirklich sicher, dass Sie die CSV-Datei und nicht die XLS-Datei ausgewählt haben? Ich kann den Fehler nur reproduzieren, wenn ich versuche, eine XLS-Datei einzulesen. Wenn ich versuche, eine CSV-Datei oder eine andere Textdatei einzulesen, kann der erhaltene Fehler nicht wiederhergestellt werden.

> Data <- read.table("test.csv",header=T,sep=",")
> Data <- read.table("test.xlsx",header=T,sep=",")
Warning message:
In read.table("test.xlsx", header = T, sep = ",") :
  incomplete final line found by readTableHeader on 'test.xlsx'

readTableHeadist die c-Funktion, die den Fehler ausgibt. Es wird versucht, die ersten n Zeilen einzulesen (standardmäßig die ersten 5), um den Datentyp zu bestimmen. Der Rest der Daten wird mit eingelesen scan(). Das Problem ist also das Format der Datei.

Eine Möglichkeit, dies herauszufinden, besteht darin, das Arbeitsverzeichnis auf das Verzeichnis festzulegen, in dem sich die Datei befindet. Auf diese Weise sehen Sie die Erweiterung der Datei, die Sie eingelesen haben. Ich weiß, dass sie unter Windows nicht als Standard angezeigt wird. Sie könnten also glauben, dass es sich um CSV handelt, obwohl dies nicht der Fall ist.

Als nächstes sollten Sie die Datei in Notepad oder Wordpad (oder einem anderen Editor) öffnen und überprüfen, ob das Format meiner Datei entspricht test.csv:

Test1,Test2,Test3
1,1,1
2,2,2
3,3,3
4,4,
5,5,
,6,

Diese Datei gibt Ihnen den folgenden Datenrahmen:

> read.table(testfile,header=T,sep=",")
  Test1 Test2 Test3
1     1     1     1
2     2     2     2
3     3     3     3
4     4     4    NA
5     5     5    NA
6    NA     6    NA

Das von Excel gespeicherte CSV-Format trennt alle Zellen durch ein Komma. Leere Zellen haben einfach keinen Wert. read.table()kann leicht damit umgehen und erkennt leere Zellen ganz gut.

Joris Meys
quelle
Angenommen, dies ist eine Windows 7-Umgebung. Wenn Kate sich die Datei ansieht, die entweder auf den Desktop oder in den Ordner kopiert wurde, hat das Symbol für eine CSV-Datei ein "a", während eine XLSX-Datei ein Symbol hat, das mehr aussieht wie ein Arbeitsblatt. Dies ist eine schnelle visuelle Methode zur Bestimmung des Dateityps. Es ist viel einfacher zu sehen, wenn es auf dem Desktop gespeichert wird, da die Symbole größer sind. :)
Michelle
7

Verwenden Sie readLines()(mit warn = FALSE), um die Datei zuerst in einen Zeichenvektor einzulesen.

Verwenden Sie danach die text =Option, um den Vektor mit in einen Datenrahmen einzulesenread.table()

    pheasant <- read.table( 
        text = readLines(file.choose(), warn = FALSE), 
        header = TRUE,  
        sep = "," 
    )
Damian
quelle
3

Mir wurde klar, dass mehrere Antworten gegeben wurden, aber noch keine wirkliche Lösung.

Der Grund ist, wie oben erwähnt, ein "Zeilenende", das am Ende der CSV-Datei fehlt.

Während der eigentliche Fix von Microsoft stammen sollte, müssen Sie die CSV-Datei mit einem Texteditor öffnen und am Ende der Datei eine Zeile einfügen (auch bekannt als Eingabetaste). Ich verwende die ATOM-Software als Text- / Code-Editor, aber praktisch alle grundlegenden Texteditoren würden dies tun.

In der Zwischenzeit melden Sie den Fehler bitte an Microsoft.

Frage: Es scheint mir, dass es sich um ein Office 2016-Problem handelt. Hat jemand das Problem auf einem PC?

Nicolas Stifani
quelle
2

Ich habe die gleiche Nachricht erhalten. Mein Fix beinhaltete: Ich habe alle zusätzlichen Blätter (Registerkarten) in der CSV-Datei gelöscht, nicht numerische Zeichen entfernt, die Datei als durch Kommas getrennt gespeichert und in R v 2.15.0 in der Standardsprache geladen:

Dateiname <-read.csv ("Dateiname", Header = TRUE)

Als zusätzlichen Schutz habe ich die Software geschlossen und erneut geöffnet, bevor ich die CSV geladen habe.

erik
quelle
2

In verschiedenen europäischen Ländereinstellungen sollte stattdessen die Funktion read.csv2 verwendet werden, da das Komma als Dezimalpunkt dient.

Yifan
quelle
2

Ich habe dieses Problem durch Ändern der Codierung im Argument read.table von fileEncoding = "UTF-16" in fileEncoding = "UTF-8" gelöst.

Dejan Pljevljakusic
quelle
1

Das von Ihnen beschriebene Problem trat bei mir auf, als ich ein .xlsxals umbenannte .csv.

Was es für mich behoben hat, war "Speichern unter" und es dann wieder als zu speichern .csv.

Jase
quelle
1

Ich habe dieses Problem einmal bekommen, als ich ein einfaches Anführungszeichen als Teil der Kopfzeile hatte. Als ich es entfernte (dh den jeweiligen Spaltenkopf von Jimmy's datain umbenannte Jimmys data), gab die Funktion keine Warnungen zurück.

loukdelouk
quelle
1

Um dieses Problem durch R selbst zu beheben, habe ich nur read.xlsx(..)anstelle von a verwendet read.csv(). Klappt wunderbar!! Sie müssen nicht einmal umbenennen. Das Umbenennen eines xlsx in csv ist keine praktikable Lösung.

Digvijay Sawant
quelle
#Digvijay_Sawant, nicht sicher, was Sie mit Ihrem letzten Kommentar meinen, aber im Gegensatz zu jeder anderen Lösung hier (ich habe fast alle ausprobiert: Wahnsinn!) War Ihre die einzige, die funktioniert hat.
W Barker
1
@WBarker In der ursprünglichen Frage hat der Autor das Excel in einer CSV gespeichert und dann versucht, es zu lesen. Wenn Sie ein Excel in CSV konvertieren, können sich möglicherweise Datenformate ändern, Daten verloren gehen usw. Excel speichert möglicherweise ein "Dateiende" in einem anderen Format als ein CSV, wodurch es für die Funktion möglicherweise schwierig wird, herauszufinden, wo die Datei endet. Nun, ich bin kein Experte, sondern nur ein Gedanke :-)
Digvijay Sawant
0

Öffnen Sie die Datei in Text Wrangler oder Notepad ++ und zeigen Sie die Formatierung an, z. B. in Text Wrangler zeigen Sie Unsichtbare an. Auf diese Weise können Sie die neuen Zeilen- oder Tabulatorzeichen sehen. Oft fügt Excel alle Arten von Tabulatoren an den falschen Stellen hinzu und nicht das letzte neue Zeilenzeichen. Sie müssen jedoch die Symbole anzeigen, um dies zu sehen.

Prepagam
quelle
0

Meine Problemumgehung bestand darin, dass ich die csvDatei in einem Texteditor öffnete , die übermäßigen Kommas für den letzten Wert entfernte und die Datei dann speicherte. Zum Beispiel für die folgende Datei

Test1,Test2,Test3
1,1,1
2,2,2
3,3,3
4,4,
5,5,
,6,,

Entfernen Sie die Kommas nach 6 und speichern Sie die Datei.

Chase Wright
quelle
0

Ich habe ein ähnliches Problem festgestellt, dies scheint jedoch eine allgemeine Warnung zu sein und hängt möglicherweise nicht mit dem Zeilenendezeichen zusammen. In meinem Fall gab es diesen Fehler, weil die von mir verwendete Datei kyrillische Zeichen enthielt. Nachdem ich sie durch lateinische Zeichen ersetzt hatte, verschwand der Fehler.

Imer Muhović
quelle
0

Ich habe versucht , verschiedene Lösungen, wie mit einem Texteditor eine neue Zeile einzufügen und das bekommt End Of Line Zeichen wie oben in der Top-Antwort empfohlen. Nichts davon hat leider funktioniert.

Die Lösung, die schließlich für mich funktioniert hat, war sehr einfach: Ich habe den Inhalt einer CSV-Datei in eine neue leere CSV-Datei kopiert, gespeichert und das Problem war behoben.

Rens
quelle