2014-10-10 11 views
5

Sto usando R 3.1.1 su Windows 7 32 bit. Sto avendo un sacco di problemi nel leggere alcuni file di testo su cui voglio eseguire analisi testuali. Secondo Notepad ++, i file sono codificati con "UCS-2 Little Endian". (grepWin, uno strumento il cui nome dice tutto, dice che il file è "Unicode".)R: impossibile leggere i file di testo Unicode anche quando si specifica la codifica

Il problema è che non riesco a leggere il file nemmeno specificando quella codifica. (I personaggi sono degli spagnoli -ñáó- set latino di serie e devono essere maneggiati facilmente con CP1252 o qualcosa di simile.)

> 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" "" "" "" "" ... 

Tutte le idee?

Grazie !!


edit: il "UTF-16", "UTF-16" e encondings "UTF-16BE" non riesce simile

+0

' '\ xff \ xfe'' è il' UTF-16LE' codifica del byte order mark (BOM) carattere. La decodifica con UTF-8 dovrebbe fallire in quanto FFh è un byte di avvio non valido, ma non ho familiarità con R. –

+1

Ho avuto lotte simili con la codifica. Ho avuto più successo con 'scan' di quanto non abbia fatto' readLines'. Prova 'scan (" nomefile.txt ", fileEncoding =" UCS-2LE ", sep =" \ n ")' –

+0

Grazie per aver risposto. Penso che dovrei riportarlo come un bug, giusto? 'scan' legge il file (e non capisco la differenza tra i parametri' fileEncoding' e 'encoding'), ma crea altri problemi. In primo luogo, occorrono solo "separatori di un byte" e, se si utilizza un separatore assurdo, esso torna allo spazio come sep. Inoltre, rimuove il \ r \ n che ho bisogno di preservare. E infine, per qualche motivo, "paste" non riesce a concatenare la stringa (restituisce solo il vettore originale). –

risposta

7

Dopo aver letto più da vicino alla documentazione, ho trovato la risposta alla mia domanda.

Il parametro encoding di readLines si applica solo alle stringhe di input param. . La documentazione dice:

codifica da assumere per le stringhe di input. Viene utilizzato per contrassegnare le stringhe del carattere come note in Latin-1 o UTF-8: non è utilizzato per ricodificare l'input. Per fare ciò, specificare la codifica come parte di la connessione con o tramite opzioni (encoding =): vedere gli esempi. Vedi anche "Dettagli".

Il modo corretto di leggere un file con una codifica non comune è, quindi,

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

Grazie per aver funzionato. Ho usato: 'hht9aa <- read.csv (file (" hht9aa_aa.txt ", encoding =" UCS-2LE "))' E finalmente ho letto correttamente i file Little Endian UTF-16. Ma non ho dovuto chiudere (con), infatti ho ricevuto un errore quando l'ho fatto, e alla fine l'ho lasciato fuori. –

Problemi correlati