2011-02-14 27 views
31

utilizo read.delim (nombre de archivo) sin ningún parámetro para leer un archivo de texto delimitado por tabuladores en R.R: multibyte inválida cadena

df = read.delim(file) 

Esto funcionó como estaba previsto. Ahora tengo un mensaje de error extraño y no puedo hacer ningún sentido de que:

Error in type.convert(data[[i]], as.is = as.is[i], dec = dec, na.strings = character(0L)) : 
invalid multibyte string at '<fd>' 
Calls: read.delim -> read.table -> type.convert 
Execution halted 

¿Alguien puede explicar qué es una cadena multibyte? ¿Qué quiere decir fd? ¿Hay otras formas de leer un archivo de pestañas en R? Tengo encabezados de columna y líneas que no tienen datos para todas las columnas.

+3

compruebe la codificación del archivo (UTF8? Latin1?) Y páselo al parámetro de la función read.delim fileEncoding –

+0

Probé eso, sin efecto. Creo que el error estaba en mi programa Java que puso algunos caracteres extraños en el archivo de texto. Sin embargo, agradecería más comentarios sobre esto porque no estoy seguro. –

+0

puede publicar el archivo y un ejemplo reproducible. entonces podríamos ayudar más. –

Respuesta

26

Me doy cuenta de que esto es bastante tarde, pero tuve un problema similar y pensé en publicar lo que funcionó para mí. Utilicé la utilidad iconv (por ejemplo, "iconv file.pcl -f UTF-8 -t ISO-8859-1 -c"). La opción "-c" omite caracteres que no se pueden traducir.

+5

intente configurar la localización del sistema con este código Sys.setlocale ("LC_ALL", "C") – user3670684

17

Tuve un problema similarmente extraño con un archivo del programa e-prime (edat -> conversión de SPSS), pero luego descubrí que hay muchas codificaciones adicionales que puede usar. esto hizo el truco para mí:

tbl <- read.delim("dir/file.txt", fileEncoding="UCS-2LE") 
0

me di cuenta de Leafpad ser un editor de texto adecuado y fácil de ver y guardar/convertir en ciertos juegos de caracteres - al menos en el linux-mundo.

Lo usé para guardar el Latin-15 en UTF-8 y funcionó.

1

Esto me pasó porque tenía el símbolo 'copyright' en uno de mis hilos! Una vez que se eliminó, se solucionó el problema.

Una buena regla general, asegúrese de que los caracteres que no aparecen en su teclado se eliminen si está viendo este error.

9

Si quiere una solución R, aquí hay una pequeña función de conveniencia que a veces uso para encontrar dónde acecha el personaje ofensivo (multiByte). Tenga en cuenta que es el siguiente personaje con lo que se imprime. Esto funciona porque print funcionará bien, pero substr arroja un error cuando hay caracteres multibyte presentes.

findOffendingCharacter <- function(x, maxStringLength=256){ 
    print(x) 
    for (c in 1:maxStringLength){ 
    offendingChar <- substr(x,c,c) 
    #print(offendingChar) #uncomment if you want the indiv characters printed 
    #the next character is the offending multibyte Character 
    }  
} 

string_vector <- c("test", "Se\x96ora", "works fine") 

lapply(string_vector, findOffendingCharacter) 

Arreglo ese personaje y vuelvo a ejecutarlo. Espero que ayude a alguien que encuentre el error invalid multibyte string.

+2

Agradable. Esto me ayudó a encontrar caracteres desconocidos/invisibles en cadenas R inmensamente grandes. – pauljohn32

Cuestiones relacionadas