Konverter binær kodning, som hovedet og Notesblok kan læse til UTF-8

Jeg har en CSV-fil, der er i binært tegnsæt, men jeg skal konvertere til UTF- 8 til behandling i HDFS (Hadoop).

Jeg har brugt nedenstående kommando til at kontrollere tegnsæt.

file -bi filename.csv 

Output:

application/octet-stream; charset=binary 

når jeg prøver at konvertere filen fra binær til UTF-8, kaster den fejl.

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

kan nogen hjælpe mig med at forstå, er det muligt at konvertere eller ej, jeg kan se dataene ved hjælp af hovedkommando.

Hvad betyder det, binært betyder ikke-læsbart, men hvordan hovedkommando eller notesblok kan læse dataene.

od -tc < filnavn.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 

Kommentarer

  • Kan du tilføj venligst output fra od -tc < yourfile.csv | head til dit spørgsmål?
  • fil -bi viser sin binære karakter, når jeg tjekker fra Vi indstiller tegnkodning viser utf-8.
  • At od output viser en UTF-8-fil med stykliste. For at file skal rapportere binært, skal der være nogle ikke-teksttegn (sandsynligvis mindst en NUL-byte efterfulgt af nogle ikke-NUL-byte) forbi det første afsnit.
  • Jeg har fjernet alle " NUL " efter at filen -bi vises som utf-8, håber at fjerne " NUL " vil ikke være et problem.

Svar

” binær “er ikke en kodning (tegn-sæt navn iconv har brug for et kodningsnavn for at udføre sit job.

file -værktøjet giver ikke nyttige oplysninger, når det ikke genkender filformatet. kunne f.eks. være UTF-16 uden et byte-kodningsmærke (BOM). notepad læser det. Det samme gælder for UTF-8 (og head vil vise det da din terminal muligvis er indstillet t o UTF-8-kodning, og det er ligeglad med en stykliste).

Hvis filen er UTF-16, viser din terminal det ved hjælp af head fordi de fleste af tegnene ville være ASCII (eller endda Latin-1), hvilket gør den “anden” byte af UTF-16-tegnene til en null.

I begge tilfælde vil manglen på stykliste (afhængigt af version af file) forvirrer det. Men andre programmer fungerer muligvis, fordi disse filformater kan bruges sammen med Microsoft Windows såvel som bærbare applikationer, der kan køre på Windows.

For at konvertere filen til UTF-8 skal du vide, hvilken kodning den har bruger, og hvad navnet på den kodning er med iconv. Hvis det allerede er UTF-8, er det valgfrit, om du tilføjer en stykliste (i starten). UTF-16 har to varianter, ifølge hvilke byte er først. Eller du kunne endda have UTF-32. iconv -l lister disse:

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” og “BE” henviser til lille ende og stor ende til byteordren. Windows bruger “LE” -smagene, og iconv antager sandsynligvis, at for smag, der mangler “LE” eller “BE”.

Du kan se dette ved hjælp af en oktal (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 

Forudsat at UTF-16LE kan du konvertere ved hjælp af

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

Kommentarer

  • Så hvordan kan jeg konvertere filen til utf-8, min intention er at konvertere ethvert format (kommer fra kilde) til utf-8.
  • @St é phaneChazelas, @ Thomas hvordan kan jeg finde min kildekodning, det fungerer ikke ' til utf- 32 (le / be) | 16 (le / be). Er der nogen kommando til at finde kildefilkodningen?
  • Som foreslået, at vise en oktal dump ville hjælpe med rådgivning …
  • @St é phaneChazelas Nedenstående fungerede, men hvad fungerer " NUL " er det godt at fjerne ?? kattens filnavn.csv | tr -d ' \ 000 ' > out.csv-fil -bi out.csv tekst / almindelig; charset = utf-8
  • @WilliamR, disse NUL-byte i din csv-fil er sandsynligvis en indikation af et bredere problem, ligesom filen blev ødelagt på en eller anden måde, da de ikke forventes i tekstfilen, og at ' er, hvad du skal se på. Se på, hvor de vises i csv-filen (skal dog vises som ^@ i vim), og se om dataene omkring det er gyldige.

Svar

strings (fra binutils) lykkes til ” udskriv strengene med udskrivbare tegn i filer “når både iconv og recode også mislykkedes, med file rapporterer stadig indholdet som binære data:

$ 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 

Kommentarer

  • strings bevarer ikke tomme linjer. Bortset fra det gør det jobbet.
  • @vulcanraven indstillingen -w (--include-all-whitespace) inkluderer nye linjer og transport vender tilbage,

Svar

https://pypi.python.org/pypi/chardet kan bruges til at bestemme kodningen af din tekst, så kan du konvertere fra det til det, du har brug for.

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

Mens file -i udskriver

application/octet-stream; charset=binary 

chardet registrerer korrekt

ascii with confidence 1.0 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *