Elabora un file che inizia con una DBA (FE FF)


10

Ho ricevuto un file .csv con la FF FEDBA:

$ 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.|

Quando lo utilizzo awkper analizzarlo ricevo un mucchio di byte null, che sospetto sia dovuto all'ordine dei byte. Come posso scambiare l'ordine dei byte su questo file (usando la CLI) in modo che gli strumenti normali funzionino con esso?

Si noti che penso che questo file sia composto solo da caratteri ASCII (ad eccezione della distinta componenti), ma non posso confermare che come si greppensa sia un file binario:

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

La ricerca della stessa stringa in VIM mostra ogni corrispondenza dei caratteri !

L'uso iconvper convertire in ASCII non elimina i valori di \ x00, in realtà aggrava il problema dato che ora sembrano byte nulli anziché 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.|

Come posso scambiare l'ordine dei byte su questo file (usando la CLI) in modo che gli strumenti normali funzionino con esso?


Il file CSV che hai creato in Windows o Mac?
cuonglm,

Puoi dare una parte del file?
cuonglm,

Ecco un link a una parte anonima del file che conserva i problemi unici con esso. Grazie!
dotancohen,

Risposte:


15

Da questo articolo di Wikipedia , FF FEsignifica UTF16LE. Quindi dovresti dire iconvdi convertire da UTF16LEa UTF8:

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

Perfetto, grazie! Avevo mischiato la BOM UTF-8 e UTF-16: ho pensato che FFFE e FEFF fossero UTF-8 e non ho mai conosciuto le BOM UTF-16. In realtà, quelle sono le distinte base UTF-16 e non ho mai conosciuto la (inutile) distinta base UTF-8 !.
dotancohen,

@dotancohen: collaudo su Fedora e la tailsoluzione funziona perfettamente. Quale sistema operativo usi?
cuonglm,

Questo non funziona (ad esempio rimuovere la distinta componenti) per la versione "iconv (GNU libiconv 1.14)" in Git Bash su Windows. Ma (per qualsiasi motivo) usare solo UTF-16invece di una delle versioni di ordine byte funziona.
Kenny Evitt,

3

dos2unix rimuove anche le distinte base e converte UTF-16 in 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 rimuove anche le distinte base UTF-8:

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

0

Risposto anche su StackOverflow: come posso rimuovere la DBA da un file UTF-8? @rici ha una buona risposta.

Risposta breve:

  • Risposta breve:, sed -i $'1s/^\uFEFF//' file.txtma non su BSD o OS / X.
  • Un'altra risposta: vi file.txt, :set nobomb, :w, semplice ma manuale
  • Installa dos2unuix; dos2unix -r file.txt
  • Questi segni hanno diversi significati possibili, incluso solo che il file è UTF-8; vedi l' articolo di Wikipedia .
  • I programmi Windows adorano aggiungere questi segni. La maggior parte degli editor non rimuoverà questi segni.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.