Converta a codificação binária que o cabeçote e o bloco de notas podem ler para UTF-8

Tenho um arquivo CSV que está em um conjunto de caracteres binários, mas preciso converter para UTF- 8 para processar em HDFS (Hadoop).

Usei o comando abaixo para verificar o conjunto de caracteres.

file -bi filename.csv 

Resultado:

application/octet-stream; charset=binary 

quando tento converter o arquivo de binário para UTF-8, ocorre um erro.

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

alguém pode me ajudar a entender se é possível converter ou não, posso ver os dados usando o comando head.

O que significa Binário significa ilegível, mas como comando head ou notepad pode ler os dados.

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 

Comentários

  • Você pode adicione a saída de od -tc < yourfile.csv | head à sua pergunta?
  • o arquivo -bi mostra seu caractere binário, quando eu verifico a partir do Vi definir a codificação de caracteres mostra utf-8. li>
  • Essa saída od mostra um arquivo UTF-8 com BOM. Para file relatar o binário, deve haver alguns caracteres não textuais (provavelmente pelo menos um byte NUL seguido por alguns bytes não NUL) após a primeira seção.
  • Eu removi todos os " NUL " depois que o arquivo -bi aparece como utf-8, Espero remover " NUL " não será um problema.

Resposta

” binary “isn” t an codificação (nome do conjunto de caracteres ). iconv precisa de um nome de codificação para fazer seu trabalho.

O utilitário file não fornece informações úteis quando não reconhece o formato do arquivo. poderia ser UTF-16 por exemplo, sem uma marca de codificação de byte (BOM). notepad lê isso. O mesmo se aplica a UTF-8 (e head exibiria que visto que seu terminal pode estar configurado para o codificação UTF-8 e não se importaria com um BOM).

Se o arquivo for UTF-16, seu terminal exibiria isso usando head porque a maioria dos caracteres seria ASCII (ou mesmo Latin-1), tornando o “outro” byte dos caracteres UTF-16 nulos.

Em ambos os casos, a falta de BOM (dependendo do versão de file) confundi-lo. Mas outros programas podem funcionar, porque esses formatos de arquivo podem ser usados com o Microsoft Windows e também com aplicativos portáteis que podem ser executados no Windows.

Para converter o arquivo para UTF-8, você precisa saber em qual codificação ele está usa e qual é o nome para essa codificação com iconv. Se já for UTF-8, a adição de um BOM (no início) é opcional. O UTF-16 tem dois sabores, de acordo com o qual o byte é o primeiro. Ou você poderia até ter UTF-32. iconv -l lista estes:

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” referem-se ao pequeno e grande final para a ordem de bytes. O Windows usa os sabores “LE” e iconv provavelmente assume que, para os sabores sem “LE” ou “BE”.

Você pode ver isso usando um 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 

Supondo UTF-16LE, você poderia converter usando

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

Comentários

  • Então, como posso converter o arquivo em utf-8? Minha intenção é converter qualquer formato (proveniente da fonte) em utf-8.
  • @St é phaneChazelas, @ Thomas como posso encontrar minha codificação de origem, ela não ' funciona para utf- 32 (le / ser) | 16 (le / ser). Existe algum comando para encontrar a codificação do arquivo de origem?
  • Como sugerido, mostrar um despejo octal ajudaria com conselhos …
  • @St é phaneChazelas O seguinte funcionou, mas o que " NUL " é bom remover ?? cat filename.csv | tr -d ' \ 000 ' > arquivo out.csv -bi out.csv texto / simples; charset = utf-8
  • @WilliamR, esses bytes NUL em seu arquivo csv são provavelmente uma indicação de um problema mais amplo, como o arquivo foi corrompido de alguma forma, já que não são esperados no arquivo de texto, e que ' é o que você deve olhar. Observe onde eles aparecem no arquivo csv (embora deva ser mostrado como ^@ no vim) e veja se os dados em torno dele são válidos.

Resposta

strings (de binutils) é bem-sucedido em ” imprimir as strings de caracteres imprimíveis em arquivos “quando iconv e recode também falharam, com file

$ 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 

Comentários

  • strings não preserva as linhas vazias. Fora isso, ele faz o trabalho.
  • @vulcanraven a opção -w (--include-all-whitespace) inclui novas linhas e carruagem retorna,

Resposta

https://pypi.python.org/pypi/chardet pode ser usado para determinar a codificação do seu texto, então você pode converter para o que você precisa.

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

Enquanto file -i imprime

application/octet-stream; charset=binary 

chardet detecta corretamente

ascii with confidence 1.0 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *