Ho un file CSV che è in un set di caratteri binari ma devo convertirlo in UTF- 8 da elaborare in HDFS (Hadoop).
Ho usato il comando seguente per controllare il set di caratteri.
file -bi filename.csv
Risultato:
application/octet-stream; charset=binary
quando provo a convertire il file da binario a UTF-8 genera un errore.
iconv -f binary -t utf-8 fiename.csv iconv: conversion from binary" is not supported Try iconv --help" or iconv --usage" for more information.
qualcuno può aiutarmi a capire se è possibile convertire o meno, posso vedere i dati usando il comando head.
Cosa significa, binario significa non leggibile ma come comando head o blocco note può leggere i dati.
od -tc < nomefile.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
Commenti
Risposta
” binary “non è” t an codifica (nome del set di caratteri ). iconv ha bisogno di un nome di codifica per fare il suo lavoro.
Lutilità file
non fornisce informazioni utili quando non riconosce il formato del file. potrebbe essere UTF-16
ad esempio, senza un byte-encoding-mark (BOM). notepad
lo legge. Lo stesso vale per UTF-8
(e head
visualizzerebbe questo poiché il tuo terminale potrebbe essere impostato come t o codifica UTF-8, e non sarebbe interessato a un BOM).
Se il file è UTF-16, il tuo terminale lo visualizzerebbe usando head
perché la maggior parte dei caratteri sarebbe ASCII (o anche Latin-1), rendendo nullo “laltro” byte dei caratteri UTF-16.
In entrambi i casi, la mancanza di BOM (a seconda del versione di file
) lo confondono. Ma altri programmi potrebbero funzionare, perché questi formati di file possono essere utilizzati con Microsoft Windows e con applicazioni portatili che possono essere eseguite su Windows.
Per convertire il file in UTF-8, devi sapere quale codifica è utilizza e qual è il nome di quella codifica con iconv
. Se è già UTF-8, laggiunta di una distinta materiali (allinizio) è facoltativa. UTF-16 ha due versioni, a seconda di quale byte è il primo. Oppure potresti anche avere UTF-32. iconv -l
elenca questi:
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” e “BE” si riferiscono a piccoli e grandi per lordine dei byte. Windows usa le versioni “LE” e iconv
probabilmente presume che per le versioni prive di “LE” o “BE”.
Puoi vederlo usando un ottale (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
Supponendo UTF-16LE, potresti convertire utilizzando
iconv -f UTF-16LE// -t UTF-8// <input >output
Commenti
- Allora, come posso convertire il file in utf-8? La mia intenzione è di convertire qualsiasi formato (proviene dalla sorgente) in utf-8.
- @St é phaneChazelas, @ Thomas come posso trovare la mia codifica sorgente, non ' t funziona per utf- 32 (le / be) | 16 (le / be). Esiste un comando per trovare la codifica del file sorgente?
- Come suggerito, mostrare un dump ottale aiuterebbe con un consiglio …
- @St é phaneChazelas Quanto segue ha funzionato ma cosa fa " NUL " è bene rimuoverlo ?? cat nomefile.csv | tr -d ' \ 000 ' > out.csv file -bi out.csv text / plain; charset = utf-8
- @WilliamR, quei byte NUL nel tuo file csv sono probabilmente unindicazione di un problema più ampio, come se il file fosse danneggiato in qualche modo perché non sono previsti nel file di testo, e che ' è quello che dovresti guardare. Guarda dove compaiono nel file csv (anche se dovrebbe essere visualizzato come
^@
in vim) e verifica se i dati intorno ad esso sono validi.
Risposta
strings
(da binutils) riesce a ” stampa le stringhe di caratteri stampabili nei file “quando anche iconv
e recode
hanno avuto esito negativo, con file
continua a segnalare il contenuto come dati binari:
$ 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
Commenti
-
strings
non conserva le righe vuote. Oltre a questo, fa il suo lavoro. - @vulcanraven lopzione
-w
(--include-all-whitespace
) include le nuove righe e il carrello restituisce,
Risposta
https://pypi.python.org/pypi/chardet può essere utilizzato per determinare la codifica del testo, quindi puoi convertirlo da quello a ciò che ti serve.
pip install chardet chardetect /my/path/to/file
Mentre file -i
stampa
application/octet-stream; charset=binary
chardet
rileva correttamente
ascii with confidence 1.0
od -tc < yourfile.csv | head
alla tua domanda?od
mostra un file UTF-8 con BOM. Affinchéfile
riporti binario, devono essere presenti alcuni caratteri non di testo (probabilmente almeno un byte NUL seguito da alcuni byte non NUL) oltre la prima sezione.