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
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
od -tc < yourfile.csv | head
à votre question?od
montre un fichier UTF-8 avec une nomenclature. Pour quefile
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.