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
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
od -tc < yourfile.csv | head
til dit spørgsmål?od
output viser en UTF-8-fil med stykliste. For atfile
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.