2014-10-10 8 views
5

Ich verwende R 3.1.1 unter Windows 7 32 Bit. Ich habe viele Probleme, einige Textdateien zu lesen, auf denen ich eine Textanalyse durchführen möchte. Laut Notepad ++ sind die Dateien mit "UCS-2 Little Endian" codiert. (grepWin, ein Werkzeug, dessen Name alles sagt, sagt, dass die Datei "Unicode" ist.)R: Unicode-Textdateien können nicht gelesen werden, selbst wenn die Codierung angegeben wird

Das Problem ist, dass ich nicht scheinen kann, die Datei zu lesen, sogar diese Kodierung verwendend. (Die Zeichen sind der Standard-spanischen lateinischen Satz -ñáó- und sollte so leicht mit CP1252 oder irgendetwas behandelt werden.)

> Sys.getlocale() 
[1] "LC_COLLATE=Spanish_Spain.1252;LC_CTYPE=Spanish_Spain.1252;LC_MONETARY=Spanish_Spain.1252;LC_NUMERIC=C;LC_TIME=Spanish_Spain.1252" 
> readLines("filename.txt") 
[1] "ÿþE" "" "" "" "" ... 
> readLines("filename.txt",encoding="UTF-8") 
[1] "\xff\xfeE" ""   ""   ""   "" ... 
> readLines("filename.txt",encoding="UCS2LE") 
[1] "ÿþE" "" "" "" "" "" ""  ... 
> readLines("filename.txt",encoding="UCS2") 
[1] "ÿþE" "" "" "" "" ... 

Irgendwelche Ideen?

Danke !!


edit: die "UTF-16", "UTF-16LE" und "UTF-16BE" encondings ähnlich

+0

' '\ xff \ xfe'' ist die' UTF-16LE' Codierung der Bytereihenfolgemarkierung (BOM) Zeichen. Die Decodierung mit UTF-8 sollte fehlschlagen, da FFh ein ungültiges Startbyte ist, aber ich kenne R. nicht. –

+1

Ich hatte ähnliche Probleme mit der Codierung. Hatte mehr Erfolg mit 'scan' als ich' readLines'. Versuchen Sie 'scan (" filename.txt ", fileEncoding =" UCS-2LE ", sep =" \ n ")' –

+0

Danke für die Antwort. Ich denke, ich würde dies als einen Fehler melden, oder? 'Scan' liest die Datei (und ich verstehe nicht den Unterschied zwischen den' fileEncoding' und 'encoding' Parameter), aber es schafft andere Probleme. Zuerst braucht es nur "Ein-Byte-Trennzeichen", und wenn Sie ein absurdes Trennzeichen verwenden, fällt es als sep in den Raum zurück. Außerdem streift es das \ r \ n, das ich bewahren muss. Und aus irgendeinem Grund kann 'paste' die Zeichenfolge nicht verketten (sie gibt nur den ursprünglichen Vektor zurück). –

Antwort

7

Nach der Lektüre genauer in der Dokumentation nicht, fand ich die Antwort auf meine Frage.

Die encoding param von readLines gelten nur die param Eingabezeichenfolgen. Die Dokumentation lautet:

Codierung für Eingabezeichenfolgen angenommen werden. Es wird verwendet, um Zeichen Zeichenfolgen zu markieren, wie in Latein-1 oder UTF-8 bekannt ist: es ist nicht verwendet re-encodieren den Eingang. Um letzteres zu tun, spezifizieren Sie die Kodierung als Teil von die Verbindung con oder über Optionen (encoding =): siehe die Beispiele. Siehe auch "Details".

Der richtige Weg, um eine Datei mit einer ungewöhnlichen Codierung zu lesen ist, dann,

filetext <- readLines(con <- file("UnicodeFile.txt", encoding = "UCS-2LE")) 
close(con) 
+2

Danke das hat für mich funktioniert. Ich benutzte: 'hht9aa <- read.csv (Datei (" hht9aa_aa.txt ", encoding =" UCS-2LE "))' Und schließlich bekam es UTF-16 Little Endian-Dateien richtig zu lesen. Aber ich musste nicht schließen (con), in der Tat habe ich einen Fehler, wenn ich das tat, und schließlich ließ es aus. –