Convertir le codage binaire que la tête et le bloc-notes peuvent lire en UTF-8

Jai un fichier CSV qui est en jeu de caractères binaires mais je dois le convertir en UTF- 8 à traiter en HDFS (Hadoop).

Jai utilisé la commande ci-dessous pour vérifier le jeu de caractères.

file -bi filename.csv 

Résultat:

application/octet-stream; charset=binary 

lorsque jessaie de convertir le fichier binaire en UTF-8, cela génère une erreur.

iconv -f binary -t utf-8 fiename.csv iconv: conversion from binary" is not supported Try iconv --help" or iconv --usage" for more information. 

quelquun peut-il maider sil vous plaît à comprendre est-il possible de convertir ou non, je peux voir les données en utilisant la commande head.

Quest-ce que cela signifie, binaire signifie non lisible mais comment commande head ou notepad peut lire les données.

od -tc < filename.csv | head

0000000 357 273 277 | | R e q u e s t _ I D # 0000020 D # T y p e # D # S u b m i t t 0000040 e r # D # S h o r t _ D e s c r 0000060 i p t i o n # D # L o g _ T e x 0000100 t # D # S t a t u s # D # A s s 0000120 i g n e d _ T o # D # A s s i g 0000140 n e e # D # C r e a t e _ D a t 0000160 e # D # F o r w T o E x t H D # 0000200 D # L a s t _ M o d i f i e d _ 0000220 B y # D # L o g _ I D # D # L o 

Commentaires

  • Pouvez-vous sil vous plaît ajouter la sortie de od -tc < yourfile.csv | head à votre question?
  • fichier -bi montre son caractère binaire, quand je vérifie à partir de Vi set encodage de caractères montre utf-8.
  • Cette sortie od montre un fichier UTF-8 avec une nomenclature. Pour que file signale le binaire, il doit y avoir des caractères non textuels (probablement au moins un octet NUL suivi de quelques octets non NUL) après cette première section.
  • Jai supprimé tous les " NUL " après que le fichier -bi saffiche sous la forme utf-8, espérons supprimer " NUL " ne sera pas un problème.

Réponse

 » binary « nest » pas un encodage (nom du jeu de caractères ). iconv a besoin dun nom dencodage pour faire son travail.

Lutilitaire file ne donne pas dinformations utiles lorsquil ne reconnaît pas le format de fichier. Il peut être UTF-16, par exemple, sans marque de codage doctet (BOM). notepad lit cela. Il en va de même pour UTF-8 (et head afficherait cela puisque votre terminal peut être configuré t o encodage UTF-8, et il ne se soucierait pas dune nomenclature).

Si le fichier est UTF-16, votre terminal lafficherait en utilisant head car la plupart des caractères seraient de lASCII (ou même du Latin-1), ce qui ferait de « lautre » octet des caractères UTF-16 une valeur nulle.

Dans les deux cas, labsence de nomenclature sera (selon le version de file) le confondre. Mais dautres programmes peuvent fonctionner, car ces formats de fichiers peuvent être utilisés avec Microsoft Windows ainsi quavec des applications portables pouvant fonctionner sous Windows.

Pour convertir le fichier en UTF-8, vous devez savoir quel encodage il utilise, et quel est le nom de cet encodage avec iconv. Sil sagit déjà de UTF-8, le fait dajouter une nomenclature (au début) est facultatif. UTF-16 a deux saveurs, selon loctet qui est le premier. Ou vous pourriez même avoir UTF-32. iconv -l répertorie ces éléments:

ISO-10646/UTF-8/ ISO-10646/UTF8/ UTF-7// UTF-8// UTF-16// UTF-16BE// UTF-16LE// UTF-32// UTF-32BE// UTF-32LE// UTF7// UTF8// UTF16// UTF16BE// UTF16LE// UTF32// UTF32BE// UTF32LE// 

« LE » et « BE » font référence à la petite et la grande extrémité pour lordre des octets. Windows utilise les saveurs « LE », et iconv suppose probablement que pour les saveurs dépourvues de « LE » ou « BE ».

Vous pouvez le voir en utilisant un octal (sic) dump:

$ od -bc big-end 0000000 000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040 \0 T \0 h \0 u \0 \0 A \0 u \0 g \0 0000020 000 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061 \0 1 \0 8 \0 \0 0 \0 5 \0 : \0 0 \0 1 0000040 000 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040 \0 : \0 5 \0 7 \0 \0 E \0 D \0 T \0 0000060 000 062 000 060 000 061 000 066 000 012 \0 2 \0 0 \0 1 \0 6 \0 \n 0000072 $ od -bc little-end 0000000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040 000 T \0 h \0 u \0 \0 A \0 u \0 g \0 \0 0000020 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061 000 1 \0 8 \0 \0 0 \0 5 \0 : \0 0 \0 1 \0 0000040 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040 000 : \0 5 \0 7 \0 \0 E \0 D \0 T \0 \0 0000060 062 000 060 000 061 000 066 000 012 000 2 \0 0 \0 1 \0 6 \0 \n \0 0000072 

En supposant UTF-16LE, vous pouvez convertir en utilisant

iconv -f UTF-16LE// -t UTF-8// <input >output 

Commentaires

  • Alors, comment puis-je convertir le fichier en utf-8, Mon intention est de convertir nimporte quel format (provenant de la source) en utf-8.
  • @St é phaneChazelas, @ Thomas comment puis-je trouver mon encodage source, il ne ' t fonctionne pour utf- 32 (le / be) | 16 (le / be). Existe-t-il une commande pour trouver le codage du fichier source?
  • Comme suggéré, afficher un vidage octal aiderait avec des conseils …
  • @St é phaneChazelas Ce qui suit a fonctionné mais quest-ce que " NUL " est-il bon de supprimer ?? cat filename.csv | tr -d ' \ 000 ' > fichier out.csv -bi out.csv texte simple; charset = utf-8
  • @WilliamR, ces octets NUL dans votre fichier csv sont probablement une indication dun problème plus large, comme le fichier a été corrompu dune certaine manière car ceux-ci ne sont pas attendus dans un fichier texte, et que ' est ce que vous devriez regarder. Regardez où ils apparaissent dans le fichier csv (bien quils devraient apparaître comme ^@ dans vim) et voyez si les données qui lentourent sont valides.

La réponse

strings (de binutils) réussit à  » imprimer les chaînes de caractères imprimables dans les fichiers « lorsque iconv et recode ont également échoué, avec file signalant toujours le contenu sous forme de données binaires:

$ file -i /tmp/textFile /tmp/textFile: application/octet-stream; charset=binary $ chardetect /tmp/textFile /tmp/textFile: utf-8 with confidence 0.99 $ iconv -f utf-8 -t utf-8 /tmp/textFile -o /tmp/textFile.iconv $ file -i /tmp/textFile.iconv /tmp/textFile.iconv: application/octet-stream; charset=binary $ cp /tmp/textFile /tmp/textFile.recode ; recode utf-8 /tmp/textFile.recode $ file -i /tmp/textFile.recode /tmp/textFile.recode: application/octet-stream; charset=binary $ strings /tmp/textFile > /tmp/textFile.strings $ file -i /tmp/textFile.strings /tmp/textFile.strings: text/plain; charset=us-ascii 

Commentaires

  • strings ne conserve pas les lignes vides. À part cela, il fait laffaire.
  • @vulcanraven loption -w (--include-all-whitespace) inclut les sauts de ligne et le chariot renvoie,

Réponse

https://pypi.python.org/pypi/chardet peut être utilisé pour déterminer le codage de votre texte, puis vous pouvez le convertir en ce dont vous avez besoin.

 pip install chardet chardetect /my/path/to/file  

Pendant que file -i imprime

application/octet-stream; charset=binary 

chardet détecte correctement

ascii with confidence 1.0 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *