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

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

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 que se debe al orden de los bytes. ¿Cómo puedo cambiar el orden de los bytes en este archivo (usando la CLI) para que las herramientas normales funcionen con él?

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

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

La búsqueda de la misma cadena en VIM muestracada personaje¡pareo!

Usar iconvpara convertir a ASCII no elimina los valores \x00; de hecho, 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 los bytes en este archivo (usando la CLI) para que las herramientas normales funcionen con él?

Respuesta1

De estoartículo de wikipedia, FF FEmedio UTF16LE. Entonces deberías decirle iconvque convierta de UTF16LEa UTF8:

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt

Respuesta2

dos2unixtambié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

dos2unixtambié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

Respuesta3

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

Respuesta corta:

  • Respuesta corta: sed -i $'1s/^\uFEFF//' file.txt, pero 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 simplemente que el archivo es UTF-8; ver elArtículo de Wikipedia.
  • A los programas de Windows les encanta agregar estas marcas. La mayoría de los editores no eliminarán estas marcas.

información relacionada