Traiter un fichier commençant par une nomenclature (FF FE)

10

J'ai reçu un fichier .csv avec la FF FEnomenclature:

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

Lorsque awkj'utilise pour l'analyser, je reçois un tas d'octets nuls, ce qui, je le soupçonne, est dû à l'ordre des octets. Comment puis-je permuter l'ordre des octets sur ce fichier (en utilisant la CLI) afin que les outils normaux fonctionnent avec lui?

Notez que je pense que ce fichier n'est que des caractères ASCII (à l'exception de la nomenclature), mais je ne peux pas confirmer que comme greppense qu'il s'agit d'un fichier binaire:

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

La recherche de la même chaîne dans VIM affiche chaque correspondance de caractères !

Utiliser iconvpour convertir en ASCII ne supprime pas les valeurs \ x00, en fait cela aggrave le problème car maintenant elles ressemblent à des octets nuls au lieu d'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.|

Comment puis-je permuter l'ordre des octets sur ce fichier (en utilisant la CLI) afin que les outils normaux fonctionnent avec lui?

dotancohen
la source
Le fichier CSV que vous avez créé sous Windows ou Mac?
cuonglm
Pouvez-vous donner une partie du dossier?
cuonglm
Voici un lien vers une partie anonymisée du fichier qui préserve les problèmes uniques avec celui-ci. Je vous remercie!
dotancohen

Réponses:

15

De cet article wikipedia , FF FEsignifie UTF16LE. Vous devriez donc dire iconvde convertir de UTF16LEà UTF8:

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt
cuonglm
la source
Parfait, merci! J'avais mélangé les nomenclatures UTF-8 et UTF-16: je pensais que FFFE et FEFF étaient UTF-8 et je n'ai jamais connu les nomenclatures UTF-16. En fait, ce sont des nomenclatures UTF-16, et je n'ai jamais connu la nomenclature (inutile) UTF-8 !.
dotancohen
@dotancohen: Je teste dans mon Fedora et la tailsolution fonctionne très bien. Quel OS utilisez-vous?
cuonglm
Cela ne fonctionne pas (ie supprimer la nomenclature) pour la version "iconv (GNU libiconv 1.14)" dans Git Bash sur Windows. Mais (pour une raison quelconque), utiliser juste UTF-16au lieu d'une des versions de l'ordre des octets fonctionne.
Kenny Evitt
3

dos2unix supprime également les nomenclatures et convertit UTF-16 en 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 supprime également les nomenclatures UTF-8:

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

A également répondu sur StackOverflow: Comment puis-je supprimer la nomenclature d'un fichier UTF-8? @rici a une bonne réponse.

Réponse courte:

  • Réponse courte:, sed -i $'1s/^\uFEFF//' file.txtmais pas sur BSD ou OS / X.
  • Une autre réponse: vi file.txt, :set nobomb, :w, simple mais manuel
  • Installez dos2unuix; dos2unix -r file.txt
  • Ces marques ont plusieurs significations possibles, notamment que le fichier est UTF-8; voir l'article Wikipedia .
  • Les programmes Windows adorent ajouter ces marques. La plupart des éditeurs ne supprimeront pas ces marques.
Charles Merriam
la source