Minulla on CSV-tiedosto, joka on binäärimerkkijoukossa, mutta minun on muunnettava UTF- 8 käsittelyyn HDFS: ssä (Hadoop).
Olen käyttänyt alla olevaa komentoa tarkistaaksesi merkistö.
file -bi filename.csv
Tulos:
application/octet-stream; charset=binary
kun yritän muuntaa tiedoston binaarisesta UTF-8: ksi, se heittää virheen.
iconv -f binary -t utf-8 fiename.csv iconv: conversion from binary" is not supported Try iconv --help" or iconv --usage" for more information.
Voiko kukaan auttaa minua ymmärtämään, onko mahdollista muuntaa vai ei, pystyn näkemään tiedot pääkomennolla.
Mitä se tarkoittaa, binaarinen tarkoittaa lukukelvoton mutta miten pääkomento tai muistilehtiö voi lukea tietoja.
od -tc < tiedostonimi.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
Kommentit
Vastaa
” binaarinen ”ei ole” t koodaus (merkistön nimi ). iconv tarvitsee koodauksen nimen tehtävänsä suorittamiseksi.
file
-apuohjelma ei anna hyödyllistä tietoa, kun se ei tunnista tiedostomuotoa. Se voi olla UTF-16
esimerkiksi ilman tavukoodausmerkkiä (BOM). notepad
lukee sen. Sama koskee UTF-8
(ja head
näyttäisi sen koska päätelaitteellesi voidaan asettaa t o UTF-8-koodaus, eikä se välitä pommista).
Jos tiedosto on UTF-16, päätelaitteesi näyttää tämän käyttämällä head
, koska suurin osa merkeistä olisi ASCII (tai jopa Latin-1), mikä tekisi UTF-16-merkkien ”muusta” tavusta nollan.
Kummassakin tapauksessa BOM: n puuttuminen (riippuen versio file
) sekoittaa sen. Mutta muut ohjelmat voivat toimia, koska näitä tiedostomuotoja voidaan käyttää sekä Microsoft Windowsissa että kannettavissa sovelluksissa, jotka saattavat toimia Windowsissa.
Tiedoston muuntamiseksi UTF-8: ksi sinun on tiedettävä, mikä koodaus se on. käyttää, ja mikä koodauksen nimi on iconv
. Jos se on jo UTF-8, niin onko lisättävä BOM (alussa) on valinnainen. UTF-16: lla on kaksi makua, joiden mukaan tavu on ensimmäinen. Tai sinulla voisi olla jopa UTF-32. iconv -l
luetellaan nämä:
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” ja ”BE” viittaavat pieneen päähän ja isoon päähän tavujärjestykselle. Windows käyttää ”LE” -makuita, ja iconv
olettaa todennäköisesti, että mauissa, joista puuttuu ”LE” tai ”BE”.
Voit nähdä tämän käyttämällä oktaalia (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
Olettaen UTF-16LE, voit muuntaa käyttämällä
iconv -f UTF-16LE// -t UTF-8// <input >output
Kommentit
- Joten miten voin muuntaa tiedoston utf-8: ksi, minun on tarkoitus muuntaa mikä tahansa muoto (tulee lähteestä) utf-8: ksi.
- @St é phaneChazelas, @ Thomas miten löydän lähdekoodaukseni, se ei toimi ' ei utf- 32 (le / be) | 16 (le / be). Onko lähdekoodauksen löytämiseksi komentoa?
- Kuten ehdotettiin, oktaalisen kaatopaikan näyttäminen auttaisi neuvojen avulla …
- @St é phaneChazelas Alla toimivat, mutta mitä " NUL " on hyvä poistaa? kissan tiedostonimi.csv | tr -d ' \ 000 ' > out.csv-tiedosto -bi out.csv teksti / tavallinen; charset = utf-8
- @WilliamR, ne NUL-tavut csv-tiedostossasi ovat todennäköisesti osoitus laajemmasta ongelmasta, kuten tiedosto vioittui jollain tavalla, koska niitä ei odoteta tekstitiedostossa, ja että ' s mitä sinun pitäisi katsoa. Katso missä ne esiintyvät csv-tiedostossa (vaikka niiden pitäisi näkyä muodossa
^@
vimissä) ja katso, ovatko sen ympärillä olevat tiedot voimassa.
vastaus
strings
(binutilsista) onnistuu ” tulosta tulostettavien merkkien merkkijonot tiedostoihin ”, kun sekä iconv
että recode
epäonnistui, file
raportoi edelleen sisällöstä binaaritiedoina:
$ 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
kommentit
-
strings
ei säilytä tyhjiä rivejä. Sen lisäksi se tekee työn. - @vulcanraven
-w
(--include-all-whitespace
) -vaihtoehto sisältää uudet rivit ja vaunun palaa,
vastaus
https://pypi.python.org/pypi/chardet voidaan käyttää tekstin koodauksen määrittämiseen, minkä jälkeen voit muuntaa siitä tarvitsemasi.
pip install chardet chardetect /my/path/to/file
Kun file -i
tulostaa
application/octet-stream; charset=binary
chardet
tunnistaa oikein
ascii with confidence 1.0
od -tc < yourfile.csv | head
-lähtö?od
-lähtö näyttää UTF-8-tiedoston, jossa on BOM. Jottafile
ilmoittaisi binaarista, ensimmäisen osan jälkeen on oltava joitain ei-tekstimerkkejä (todennäköisesti vähintään yksi NUL-tavu, jota seuraa joitakin muita kuin NUL-tavuja).