r sas byte-order-mark

Deshacerse de BOM entre SAS y R



byte-order-mark (2)

Utilicé SAS para guardar un archivo de texto delimitado por tabuladores con codificación utf8 en una máquina de Windows. Luego traté de abrir esto en R:

read.table(myfile, header =TRUE, sep = "/t")

Para mi sorpresa, la información estaba totalmente desordenada, pero solo de manera furtiva. Los valores numéricos cambiaron aleatoriamente, pero el diseño general se veía normal, por lo que me tomó un tiempo darme cuenta del problema, que supongo que ahora es la lista de materiales .

Este no es un problema nuevo, por supuesto; lo abordan brevemente aquí , y recomiendan usar

read.table(myfile, fileEncoding = "UTF-8", header =TRUE, sep = "/t")

Sin embargo, esto no hizo ninguna mejora! Mi única solución fue suprimir el encabezado, con o sin el argumento fileEncoding :

read.table(myfile, fileEncoding = "UTF-8", header =FALSE, sep = "/t") read.table(myfile, header =FALSE, sep = "/t")

En cualquier caso, tengo que hacer algunos negocios divertidos para reemplazar los nombres de columna con la primera fila, pero solo después de eliminar alguna versión de la lista de materiales que aparece al principio del nombre de la primera columna ( <U+FEFF> si uso fileEncoding y  si no uso fileEncoding ).

¿No hay una manera simple de eliminar la lista de materiales y usar read.table sin ningún argumento especial?

Actualización para @Joe: el SAS que utilicé:

FILENAME myfile ''C:/Documents ... file.txt'' encoding="utf-8"; proc export data=lib.sastable outfile=myfile dbms=tab replace; putnames=yes; run;

Actualización sobre más rarezas: el uso de fileEncoding="UTF-8-BOM" como @Joe sugerido en su solución a continuación parece eliminar la lista de materiales. Sin embargo , no solucionó mi problema de motivación original, que es la corrupción en los datos; la fila del encabezado está bien, pero extrañamente los últimos dígitos de la primera columna de números se arruinan. Le daré crédito a Joe por su respuesta. ¿Tal vez mi problema no es realmente un problema de lista de materiales?

Solución de corte: use fileEncoding="UTF-8-BOM" Y también incluya el argumento colClasses = "character" . No tengo idea de por qué esto funciona para solucionar el problema de corrupción de datos: podría ser el tema de una pregunta futura.


Según su enlace, parece que funciona para mí con:

read.table(''c://temp//testfile.txt'',fileEncoding=''UTF-8-BOM'',header=TRUE,sep=''/t'')

observe el -BOM en la codificación del archivo.

Esto está en 2.1 Variaciones en read.table en la documentación de r. En la codificación de menos de 12, consulte "Bajo UNIX, es posible que necesite ...", que aparentemente se aplica incluso en Windows ahora (para mí, al menos).


o puede usar las options=NOBOMFILE sistema sas options=NOBOMFILE the write a uft-8 file without the BOM.