R: Lesen.Tabelle interpretiert \r neue Zeile
Zusammenfassung
Ich versuche zu Lesen, twitter-Daten mit read.table
. Aber ich habe Zeilen beendet, nur in \r
die Probleme verursacht, so möchte ich überspringe ein paar Zeilen.
Daten-format
Werden die Daten in eine tab-getrennte csv-und in der folgenden form:
id \t userid \t date \t latitude \t longitude \t location \t tweet \r\n
(Hinweis: ich fügte Leerzeichen für die Lesbarkeit, und die \t
, \r
und \n
sind, wie erwartet, TAB, CR und LF)
Einige Beispiele sind:
488397447040086017 1220042672 20140713190000 -22.923528 -43.238966 Rio de Janeiro, Rio de Janeiro os moradores da minha rua devem me odiar
488397446960381952 1960969112 20140713190000 60.998575 68.998468 Ханты-Мансийск, Ханты-Мансийск Вот интересом, мне одной пофиг на футбол?
488397446997762049 1449959828 20140713190000 32.777693 -97.307257 Fort Worth, TX Buena suerte Argentina
Lesen in Daten
Gab es einige Probleme (#
als Kommentar '
als quote-Zeichen, Codierung, ...), die ich teilweise gelöst:
readTweets <- function(fileName) {
# read tweets from file
tweets <- read.table(fileName, sep = "\t", quote = "", comment.char = "",
col.names = c("id", "user", "date", "latitude",
"longitude", "location", "tweet"),
colClasses = c("numeric", "numeric", "character",
"double", "double", "character",
"character"), encoding = "utf8")
tweets
}
Wie Sie leicht erkennen können ich habe auch die colClasses
parameter zu geben, werden die Felder einige nützliche Typen (ich habe auch die Spalte Datum, um POSIXct
, aber ich habe zu tun, die Formatierung, die mich - Seite Suche: gibt es eine Möglichkeit, Funktionen zu importierten Spalten automatisch?).
Der Fehler
Dieser arbeitete auf einem kleinen test-set wie oben angegeben. Allerdings, wenn ich versuchte, Sie zum laden eines größeren Datensatzes, ich bekam die folgende Fehlermeldung:
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
scan() expected 'a real', got '(:'
Ein wenig von der Suche über den Datei-zeigt den folgenden Eintrag:
488397464438071297 403662206 20140713190004 19.320504 -76.426316 @Toneishe_Lovee @purifiedhoran
(:
Diese sieht aus wie es ist nur ein Zeilenumbruch an der falschen Stelle! Das ist ein großes problem jetzt, wie kann ich sagen, dass eine Linie ist eine neue Linie oder nicht? Und warum ist es so? Ich beschloss, einen genaueren Blick und fand heraus, dass (Bereiche wieder Hinzugefügt, jetzt siehst du, warum ich geschrieben das format mehr genau) mit dem "alle Zeichen" - Option in Notepad++, wie der Eintrag eigentlich Aussehen:
488397464438071297 \t 403662206 \t 20140713190004 \t 19.320504 \t -76.426316 \t @Toneishe_Lovee @purifiedhoran \r (: \r\n
Hinweis: die CR
vor dem smiley.
Die einfache Lösung
Ich irgendwie "lösen" dieses problem durch das Lesen in der ersten Spalte als Zeichen, füllen sich die Zeilen und die Einstellung leere Felder NA
und dann mit complete.cases
:
readTweets <- function(fileName) {
# read tweets from file
tweets <- read.table(fileName, sep = "\t", quote = "", comment.char = "",
col.names = c("id", "user", "date", "latitude",
"longitude", "location", "tweet"),
colClasses = c("character", "numeric", "character",
"double", "double", "character",
"character"), encoding = "utf8",
fill = TRUE, na.strings = TRUE)
# remove incorrect rows and convert id to numeric
tweets <- tweets[complete.cases(tweets[,c("id", "user", "date")]),]
tweets$id <- as.numeric(tweets$id)
rownames(tweets) <- NULL
tweets
}
Ich Frage mich immer noch, wenn es sogar möglich, geben Sie CRs in twitter oder die person, die mir die csv-Dateien einfach nur versaut das format bis.
Die professionelle Lösung
Ist es möglich, überspringen die nicht vollständige Zeilen (ohne Verarbeitung aller Daten wieder) so, dass ich das colClass numerische ID direkt?
OS/File/etc.
Wie gewünscht, in den Kommentaren hier einige weitere technische Informationen:
- $Plattform: "x86_64-w64-mingw32"
- $system: "x86_64, mingw32"
- $svn rev: "66115"
- $version.string: "R-version 3.1.1 (2014-07-10)"
- Betriebssystem: Windows 8 (ich habe nicht erwarten, dass R laufen mit meiner mingw-installation)
Beispiel-Datei:
- Download, 788 B, csv (tab-getrennt), enthält 5 tweets-einschließlich der fehlerhafte (der zweite)
- - Datei-format UTF-8 ohne BOM mit Notepad++ erkennt die Zeilenenden in Dos\Windows
- Ohne eine Beispiel-Datei, um mit zu spielen, ist es schwer, eine Probe mit dem gleichen bytes sind Ihnen zu tun, alle Tests. Auch, was das OS und der R-version sind Sie als Zeilenumbrüche unterscheiden sich vom OS.
- Wo sollte ich Sie am besten hochladen von Dateien für stack-überlauf, so dass Sie für Generationen? Ich bin mit Windows, aber die Datei selbst sollte nicht unterscheiden sich von Betriebssystem zu Betriebssystem. R ist die version 3.1.1. Ich füge die Informationen zu der Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da R läuft auf mehreren Betriebssystemen, und verschiedene Betriebssysteme verwenden verschiedene Zeilenenden, kann es ziemlich schwierig sein, genau zu kontrollieren, was wird verwendet, wie eine Linie endet, die Arbeit wird auf allen Betriebssystemen. Die einfachste Möglichkeit dieses Problem zu beheben wäre, wickeln Sie den tweet Spalte in Anführungszeichen. Wenn Sie zitiert haben Felder, eingebettet Zeilenwechsel erlaubt. Ansonsten können Sie manipulieren die bytes mit regulären Ausdrücken und so. Es hängt alles davon ab, was Sie zu tun beabsichtigen, mit der eingebettete Zeilenumbrüche. Nicht sicher, wenn Sie wollen, um Sie zu bewahren oder nicht.
Hier ist ein dump deiner Beispieldatei
Können wir es aufteilen in ein Zeichen matrix mit
Dann können wir konvertieren die Daten.Rahmen
dann, wenn Sie schreiben diese in eine Datei (und die Charakter-Werte anzugeben)
Lesen Sie es zurück in ohne Probleme mit
Also, wenn Sie die Datei zu Ihnen kam, mit den Anführungszeichen, um die Letzte Spalte, es wäre viel einfacher, um es zu importieren.
Und wenn Sie möchten, Lesen Sie die Datei als eine große Zeichenkette als ich Tat, zu erstellen
ctx
Sie können tun, dass mitwas hilfreich sein kann, wenn Sie wollen, um andere Manipulationen erste. Zum Beispiel, möchten Sie vielleicht, um die zu entfernen
\r
Werte, nicht gefolgt von\n
. Sie konnte tun, was mitund ich denke, Sie können Lesen Sie direkt zu Lesen.Tabelle
(Ich Teste auf einem Mac, die verwendet verschiedene Zeilenenden, so dass es nicht funktionieren wird, aber es kann auf windows).
readChar
in Kombination mitgsub
hat den trick ganz gut (obwohl ich habe die regex zu\\r(?!\\n)
, die ich denke, ist einfacher zu interpretieren ist) und das hilft mir viel. Danke!!!\r
. Sie können neue Zeilen in den tweets so, dass scheint völlig gültig. Ja, diese version der regex ist einfacher zu Lesen. Ich dachte, ich hatte versucht auf meinem mac, aber es funktionierte nicht, jedoch auf die Wiederholung der Prüfungen es scheint zu funktionieren nur fine. Ich werde aktualisieren, die Antwort.