So lesen Sie zitierten Text, der maskierte Anführungszeichen enthält
Frage
Betrachten Sie die folgende durch Kommas getrennte Datei.Der Einfachheit halber soll es eine Zeile enthalten:
'I am quoted','so, can use comma inside - it is not separator here','but can\'t use escaped quote :=('
Wenn Sie versuchen, es mit dem Befehl zu lesen
table <- read.csv(filename, header=FALSE)
Die Zeile wird in 4 Teile geteilt, da die Zeile 3 Kommas enthält.Tatsächlich möchte ich nur drei Teile lesen, von denen einer selbst ein Komma enthält.Da kommt die Quote-Flagge zur Hilfe.Ich habe es versucht:
table <- read.csv(filename, header=FALSE, quote="'")
aber das ist ein Irrtum "incomplete final line found by readTableHeader on table"
.Dies geschieht aufgrund der ungeraden (sieben) Anzahl von Anführungszeichen.
read.table()
sowie scan()
Parameter haben allowEscapes
, aber setzen Sie es auf TRUE
hilft nicht.Es ist in Ordnung, denn von help(scan)
du kannst lesen:
Die Flüchtlinge, die interpretiert werden, sind die Kontrollzeichen ' a, b, f, n, r, t, v', ......Jeder andere entkommene Charakter wird als sich selbst behandelt, einschließlich Backslash
Bitte schlagen Sie vor, wie Sie solche zitierten CSV-Dateien lesen würden, die Escapezeichen enthalten \'
Zitate.
Lösung
Eine Möglichkeit ist die Nutzung readLines()
um alles so vorzulesen, wie es ist, und fahren Sie dann fort, indem Sie das Anführungszeichen durch etwas anderes ersetzen, z. B.:
tt <- readLines("F:/temp/test.txt")
tt <- gsub("([^\\]|^)'","\\1\"",tt) # replace ' by "
tt <- gsub("\\\\","\\",tt) # get rid of the double escape due to readLines
Dadurch können Sie den Vektor tt mit a einlesen textConnection
zz <- textConnection(tt)
read.csv(zz,header=F,quote="\"") # give text input
close(zz)
Nicht die schönste Lösung, aber sie funktioniert (vorausgesetzt, Sie haben natürlich nicht irgendwo in der Datei ein „Zeichen ...“)
Andere Tipps
read_delim
aus dem Paket Leser kann mithilfe der Argumente mit maskierten Anführungszeichen umgehen escape_double
Und escape_backslash
.
read_delim(file, delim=',', escape_double=FALSE, escape_backslash=TRUE, quote="'")
(Beachten Sie, dass ältere Versionen von readr Zeilenumbrüche in CSV-Headern in Anführungszeichen nicht korrekt unterstützen: https://github.com/tidyverse/readr/issues/784)