Procesar un archivo que comienza con una lista de materiales (FF FE)

10

Recibí un archivo .csv con la FF FElista de materiales:

$ head -n1 dotan.csv | hd
00000000  ff fe 41 00 64 00 20 00  67 00 72 00 6f 00 75 00  |..A.d. .g.r.o.u.|

Cuando lo uso awkpara analizarlo, obtengo un montón de bytes nulos, lo que sospecho se debe al orden de bytes. ¿Cómo puedo cambiar el orden de bytes en este archivo (usando la CLI) para que las herramientas normales funcionen con él?

Tenga en cuenta que creo que este archivo solo tiene caracteres ASCII (excepto la lista de materiales), pero no puedo confirmarlo porque greppiensa que es un archivo binario:

$ grep -P '^[\x00-\x7f]' dotan.csv 
Binary file dotan.csv matches

¡Buscar la misma cadena en VIM muestra cada coincidencia de caracteres !

El uso iconvde convertir a ASCII no elimina los valores \ x00, en realidad empeora el problema ya que ahora parecen bytes nulos en lugar de UTF-8.

$ iconv -f UTF-8 -t ASCII dotan.csv > fixed.txt 
iconv: illegal input sequence at position 0

$ iconv -f UTF-8 -t ASCII//IGNORE dotan.csv > fixed.txt

$ head -n1 fixed.txt | hd
00000000  41 00 64 00 20 00 67 00  72 00 6f 00 75 00 70 00  |A.d. .g.r.o.u.p.|

¿Cómo puedo cambiar el orden de bytes en este archivo (usando la CLI) para que las herramientas normales funcionen con él?

dotancohen
fuente
¿El archivo CSV que creaste en Windows o Mac?
Cuonglm
¿Puedes dar una porción de archivo?
Cuonglm
Aquí hay un enlace a una parte anónima del archivo que conserva los problemas únicos con él. ¡Gracias!
dotancohen

Respuestas:

15

De este artículo de Wikipedia , FF FEsignifica UTF16LE. Entonces debes decir iconvconvertir de UTF16LEa UTF8:

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt
Cuonglm
fuente
¡Perfecto, gracias! Tenía la lista de materiales UTF-8 y UTF-16 mezclada: pensé que FFFE y FEFF eran UTF-8 y nunca supe las listas de materiales UTF-16. En realidad, esos son BOM UTF-16, ¡y nunca supe el (inútil) BOM UTF-8 !.
dotancohen
@dotancohen: pruebo en mi Fedora y la tailsolución funciona bien. ¿Qué sistema operativo usas?
Cuonglm
Esto no funciona (es decir, eliminar la lista de materiales) para la versión "iconv (GNU libiconv 1.14)" en Git Bash en Windows. Pero (por cualquier motivo), el uso de solo en UTF-16lugar de una de las versiones de orden de bytes funciona.
Kenny Evitt
3

dos2unix también elimina las listas de materiales y convierte UTF-16 a UTF-8:

$ printf %s あ|recode ..utf16 >a;xxd -p a;dos2unix a;xxd -p a
feff3042
dos2unix: converting file a to Unix format...
e38182

dos2unix también elimina las listas de materiales UTF-8:

$ printf %b '\xef\xbb\xbfa'>a;dos2unix a;xxd -p a
dos2unix: converting file a to Unix format...
61
nisetama
fuente
0

También respondió en StackOverflow: ¿Cómo puedo eliminar la lista de materiales de un archivo UTF-8? @rici tiene una buena respuesta.

Respuesta corta:

  • Respuesta corta: sed -i $'1s/^\uFEFF//' file.txtpero no en BSD u OS / X.
  • Otra respuesta: vi file.txt, :set nobomb, :w, simple pero Manual
  • Instalar dos2unuix; dos2unix -r file.txt
  • Estas marcas tienen varios significados posibles, incluido solo que el archivo es UTF-8; ver el artículo de Wikipedia .
  • Los programas de Windows adoran agregar estas marcas. La mayoría de los editores no eliminarán estas marcas.
Charles Merriam
fuente