r utf-8 character-encoding data.table

Forzar la codificación del vector de caracteres de "desconocido" a "UTF-8" en R



character-encoding data.table (2)

Tengo un problema con la codificación inconsistente del vector de caracteres en R.

El archivo de texto del que leí una tabla está codificado (a través de Notepad++ ) en UTF-8 (también probé con UTF-8 without BOM ).

Quiero leer la tabla de este archivo de texto, convertirla en data.table , establecer una key y hacer uso de la búsqueda binaria. Cuando intenté hacerlo, apareció lo siguiente:

Mensaje de advertencia: En [.data.table (poli.dt, "żżonymi", mult = "first"): Se detectó una codificación conocida (latin1 o UTF-8) en una columna de unión. data.table compara los bytes actualmente, por lo que no admite bien las codificaciones mixtas ; es decir, utilizando tanto latin1 como UTF-8, o si alguna de las codificaciones desconocidas son no ascii y algunas de ellas están marcadas como conocidas y otras no. Pero si se usa exclusivamente latin1 o UTF-8, y todas las codificaciones desconocidas son ascii, entonces el resultado debería estar bien. En el futuro verificaremos por usted y evitaremos esta advertencia si todo está bien. La parte difícil es hacer esto sin afectar el rendimiento en casos solo de ascii.

y la búsqueda binaria no funciona .

Me di cuenta de que mi columna data.table - key consta de los tipos de codificación "desconocido" y "UTF-8":

> table(Encoding(poli.dt$word)) unknown UTF-8 2061312 2739122

Intenté convertir esta columna (antes de crear un objeto data.table ) con el uso de:

  • Encoding(word) <- "UTF-8"
  • word<- enc2utf8(word)

pero sin efecto

También probé algunas formas diferentes de leer un archivo en R (configurando todos los parámetros útiles, por ejemplo, encoding = "UTF-8" ):

  • data.table::fread
  • utils::read.table
  • base::scan
  • colbycol::cbc.read.table

pero sin efecto

==================================================

Mi R.version:

> R.version _ platform x86_64-w64-mingw32 arch x86_64 os mingw32 system x86_64, mingw32 status major 3 minor 0.3 year 2014 month 03 day 06 svn rev 65126 language R version.string R version 3.0.3 (2014-03-06) nickname Warm Puppy

Información de mi sesión:

> sessionInfo() R version 3.0.3 (2014-03-06) Platform: x86_64-w64-mingw32/x64 (64-bit) locale: [1] LC_COLLATE=Polish_Poland.1250 LC_CTYPE=Polish_Poland.1250 LC_MONETARY=Polish_Poland.1250 [4] LC_NUMERIC=C LC_TIME=Polish_Poland.1250 base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] data.table_1.9.2 colbycol_0.8 filehash_2.2-2 rJava_0.9-6 loaded via a namespace (and not attached): [1] plyr_1.8.1 Rcpp_0.11.1 reshape2_1.2.2 stringr_0.6.2 tools_3.0.3


La función de Encoding devuelve unknown si una cadena de caracteres tiene una marca de "codificación nativa" (CP-1250 en su caso) o si está en ASCII. Para discriminar entre estos dos casos, llame a:

library(stringi) stri_enc_mark(poli.dt$word)

Para verificar si cada cadena consta de secuencias de bytes UTF-8 válidas, llame a:

all(stri_enc_isutf8(poli.dt$word))

Si no es el caso, entonces su archivo no está en UTF-8 en absoluto.

Sospecho que no le ha indicado a R mientras leía el archivo que efectivamente está en UTF-8 (debería bastar con mirar el contenido de poli.dt$word para verificar esta declaración). Si mi suposición es cierta, intente:

read.csv2(file("filename", encoding="UTF-8"))

o

poli.dt$word <- stri_encode(poli.dt$word, "", "UTF-8") # re-mark encodings

Si data.table aún se queja de las codificaciones "mixtas", es posible que desee transliterar los caracteres que no son ASCII, por ejemplo:

stri_trans_general("Zażółć gęślą jaźń", "Latin-ASCII") ## [1] "Zazolc gesla jazn"


No pude encontrar una solución para un problema similar. No pude volver a traducir los caracteres de codificación desconocidos de un archivo txt en algo más manejable en R.

Por lo tanto, me encontraba en una situación en la que el mismo personaje aparecía más de una vez en el mismo conjunto de datos, porque estaba codificado de manera diferente ("X" en configuración latina y "X" en configuración griega). Sin embargo, la operación de guardar txt conservó esa diferencia de codificación, por supuesto, bien hecha.

Probando algunos de los métodos anteriores, nada funcionó. El problema está bien descrito "no se puede distinguir ASCII de UTF-8 y el bit no se mantendrá incluso si lo configura" .

Una buena solución es "exportar su data.frame a un archivo temporal CSV y volver a importar con data.table :: fread (), especificando Latin-1 como codificación de origen". .

Reproduciendo / copiando el ejemplo dado de la fuente anterior:

package(data.table) df <- your_data_frame_with_mixed_utf8_or_latin1_and_unknown_str_fields fwrite(df,"temp.csv") your_clean_data_table <- fread("temp.csv",encoding = "Latin-1")

Espero que ayude a alguien que.