Converti la codifica binaria che head e Blocco note possono leggere in UTF-8

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

  • Puoi per favore aggiungi loutput di od -tc < yourfile.csv | head alla tua domanda?
  • file -bi mostra il suo carattere binario, quando controllo da Vi la codifica dei caratteri impostata mostra utf-8.
  • Loutput 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.
  • Ho rimosso tutti i " NUL " dopo che il file -bi è stato visualizzato come utf-8, spero di rimuovere " NUL " non sarà un problema.

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 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *