R schreiben.csv mit UTF-16-Codierung
Ich habe Probleme beim ausgeben von Daten.Rahmen mit write.csv
mit UTF-16-Zeichencodierung.
Hintergrund: ich bin versucht zu schreiben, aus einer CSV-Datei von einem Daten.Rahmen für die Verwendung in Excel. Excel Mac 2011 scheint nicht zu mögen UTF-8 (wenn ich angeben, UTF-8 im text importieren, nicht-ASCII-Zeichen als Unterstriche). Ich habe Anlass zu glauben, dass Excel gerne mit UTF-16LE-Codierung.
Hier ist die Beispiel-Daten.Rahmen:
> foo
a b
1 á 羽
> Encoding(levels(foo$a))
[1] "UTF-8"
> Encoding(levels(foo$b))
[1] "UTF-8"
Also habe ich versucht, die Ausgabe der Daten.frame-by-doing:
f <- file("foo.csv", encoding="UTF-16LE")
write.csv(foo, f)
Dieser gibt mir eine ASCII-Datei sieht wie folgt aus:
"","
Wenn ich encoding="UTF-16"
, bekomme ich eine Datei, die enthält nur die byte-order mark 0xFE 0xFF
.
Wenn ich encoding="UTF-16BE"
, erhalte ich eine leere Datei.
Dies ist auf einem 64-bit-version von R-2.12.2 auf Mac OS X 10.6.6. Was mache ich falsch?
- Für das Protokoll, WTF ist falsch mit Excel und UTF-8? Ich meine, come on, es ist 2011.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie einfach speichern Sie die csv in UTF-8 und später konvertieren zu UTF-16LE mit iconv im terminal.
Wenn Sie darauf bestehen, es zu tun in R, die folgenden funktionieren könnte - obwohl es scheint, dass
iconv
in R macht einige Probleme, siehe: http://tolstoy.newcastle.edu.au/R/e10/devel/10/06/0648.htmlWie Sie sehen können die oben verlinkte patch ist wirklich notwendig - die habe ich nicht getestet, aber wenn Sie es behalten wollen simly (und böse): rufen Sie einfach den Dritten "iconv" - Programm innerhalb R mit einem
system
rufen Sie nach dem speichern der Tabelle zu csv.system
Funktion - auf diese Weise werden Sie nicht haben, um starten Sie ein separates Programm. Man könnte auch den Prozess automatisieren, indem eine kleine Funktion, die speichert die csv und auch konvertiert, um die gewünschte Codierung. Viel Glück jedenfalls!sowas machen könnte (
write.csv()
ignoriert einfach die Kodierung, so dass Sie haben zu entscheiden Sie sich fürwritLines()
oderwriteBin()
) ...