Muunna binäärikoodaus, jonka pää ja Muistio voivat lukea UTF-8: ksi

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

  • Voitko lisää kysymyksesi od -tc < yourfile.csv | head -lähtö?
  • tiedosto -bi näyttää sen binäärimerkin, kun tarkistan Vi-joukosta, merkintäkoodaus näyttää utf-8.
  • Tämä od -lähtö näyttää UTF-8-tiedoston, jossa on BOM. Jotta file 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).
  • Olen poistanut kaikki " NUL " sen jälkeen, kun tiedosto -bi näkyy muodossa utf-8, Toivottavasti poistan " NUL " ei ole ongelma.

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 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *