Jeg har en CSV-fil som er i binært tegnsett, men jeg må konvertere til UTF- 8 for å behandle i HDFS (Hadoop).
Jeg har brukt kommandoen nedenfor for å sjekke tegnsett.
file -bi filename.csv
Utgang:
application/octet-stream; charset=binary
når jeg prøver å konvertere filen fra binær til UTF-8, kaster den feil.
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 noen hjelpe meg med å forstå er det mulig å konvertere eller ikke, jeg kan se dataene ved hjelp av hodekommandoen.
Hva betyr det, binært betyr ikke-lesbart, men hvordan hodekommando eller notisblokk kan lese 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 koding (tegnsettnavn iconv trenger et kodingsnavn for å gjøre jobben sin.
file
verktøyet gir ikke nyttig informasjon når det ikke gjenkjenner filformatet. kan for eksempel være UTF-16
uten byte-kodingsmerke (BOM). notepad
leser det. Det samme gjelder UTF-8
(og head
vil vise det siden terminalen din kan være satt t o UTF-8-koding, og det bryr seg ikke om en BOM).
Hvis filen er UTF-16, vil terminalen din vise at du bruker head
fordi de fleste tegnene vil være ASCII (eller til og med Latin-1), noe som gjør den «andre» byten til UTF-16-tegn til null.
I begge tilfeller vil mangelen på stykklisten (avhengig av versjon av file
) forvirrer det. Men andre programmer kan fungere, fordi disse filformatene kan brukes med Microsoft Windows, så vel som bærbare applikasjoner som kan kjøres på Windows.
For å konvertere filen til UTF-8, må du vite hvilken koding den bruker, og hva navnet på den kodingen er med iconv
. Hvis det allerede er UTF-8, er det valgfritt om du legger til en BOM (i begynnelsen). UTF-16 har to smaker, ifølge hvilke byte er først. Eller du kan til og med ha UTF-32. iconv -l
lister opp 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» refererer til liten ende og stor ende for byteordren. Windows bruker «LE» -smakene, og iconv
antar sannsynligvis at for smakene som mangler «LE» eller «BE».
Du kan se dette ved å bruke 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
Forutsatt at UTF-16LE kan du konvertere ved hjelp av
iconv -f UTF-16LE// -t UTF-8// <input >output
Kommentarer
- Så hvordan kan jeg konvertere filen til utf-8, min intensjon er å konvertere hvilket som helst format (kommer fra kilde) til utf-8.
- @St é phaneChazelas, @ Thomas hvordan kan jeg finne kildekodingen min, det fungerer ikke ' for utf- 32 (le / be) | 16 (le / be). Er det noen kommando for å finne kildekodekodingen?
- Som foreslått, kan det være råd å vise en oktal dump …
- @St é phaneChazelas Nedenfor fungerte, men hva gjør " NUL " er det bra å fjerne ?? kattens filnavn.csv | tr -d ' \ 000 ' > out.csv-fil -bi out.csv tekst / vanlig; charset = utf-8
- @WilliamR, disse NUL-bytene i csv-filen din er sannsynligvis en indikasjon på et større problem, som om filen ble ødelagt på noen måte, ettersom de ikke forventes i tekstfilen, ' er det du bør se på. Se på hvor de vises i csv-filen (men skal vises som
^@
i vim) og se om dataene rundt den er gyldige.
Svar
strings
(fra binutils) lykkes til » skriv ut strengene med utskrivbare tegn i filer «når både iconv
og recode
også mislyktes, med file
rapporterer fortsatt innholdet 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. Annet enn det gjør den jobben. - @vulcanraven alternativet
-w
(--include-all-whitespace
) inkluderer nye linjer og vogn returnerer,
Svar
https://pypi.python.org/pypi/chardet kan brukes til å bestemme kodingen av teksten din, så kan du konvertere fra det til det du trenger.
pip install chardet chardetect /my/path/to/file
Mens file -i
skriver ut
application/octet-stream; charset=binary
chardet
registrerer riktig
ascii with confidence 1.0
od -tc < yourfile.csv | head
til spørsmålet ditt?od
-utgangen viser en UTF-8-fil med BOM. For atfile
skal rapportere binært, må det være noen ikke-teksttegn (sannsynligvis minst en NUL-byte etterfulgt av noen ikke-NUL-byte) forbi den første delen.