Konvertálja a bináris kódolást, amelyet a fej és a Jegyzettömb el tud olvasni UTF-8-ra

Van egy CSV fájlom, amely bináris karakterkészletben van, de át kell alakítanom UTF- 8 a HDFS-ben (Hadoop) történő feldolgozáshoz.

Az alábbi parancsot használtam a karakterkészlet ellenőrzésére.

file -bi filename.csv 

Kimenet:

application/octet-stream; charset=binary 

amikor megpróbálom a fájlt binárisról UTF-8-ra konvertálni, az hibát okoz.

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

Tud-e valaki segíteni abban, hogy megértsem, konvertálható-e vagy sem, a fejparancs segítségével láthatom az adatokat.

Mit jelent, a bináris azt jelenti, hogy nem olvasható, de hogyan fejparancs vagy jegyzettömb képes olvasni az adatokat.

od -tc < fájlnév.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 

Megjegyzések

  • Tudsz kérjük, adja hozzá a od -tc < yourfile.csv | head kimenetet a kérdéséhez?
  • A -bi fájl bináris karakterét mutatja, Amikor a Vi készletből ellenőrzöm, a karakterkódolás az utf-8-at mutatja. li>
  • Ez a od kimenet egy UTF-8 fájlt mutat BOM-mal. Ahhoz, hogy a file binárisan jelentse, az első szakaszon túl kell lennie néhány nem szöveges karakternek (valószínűleg legalább egy NUL-bájtnak, majd néhány nem NUL-os bájtnak).
  • Minden " NUL " elemet eltávolítottam, miután az -bi fájl utf-8-ként jelenik meg, remélem, hogy eltávolítom a " NUL " nem jelent problémát.

Válasz

” bináris “nem” t an kódolás (karakterkészlet neve ). Az iconv-nek kódolási névre van szüksége a munkája elvégzéséhez.

A file segédprogram nem ad hasznos információkat, ha nem ismeri fel a fájlformátumot. lehet például UTF-16, bájtkódoló jel nélkül (BOM). notepad ezt olvassa. Ugyanez vonatkozik a UTF-8 (és head megjelenítené ezt , mivel a terminál t beállítható o UTF-8 kódolás, és nem érdekelne egy BOM).

Ha a fájl UTF-16, akkor a terminál ezt a head használatával jeleníti meg, mert a legtöbb karakter ASCII (vagy akár Latin-1) lenne, ami az UTF-16 karakterek “másik” byte-ját nullává tenné.

Mindkét esetben a BOM hiánya (a file) verziója összekeveri. De más programok működhetnek, mert ezek a fájlformátumok használhatók a Microsoft Windows, valamint a Windows rendszeren futó hordozható alkalmazások esetén is.

A fájl UTF-8 formátumba konvertálásához tudnia kell, hogy melyik kódolja használ, és mi az a kódolás neve az iconv névvel. Ha ez már UTF-8, akkor nem kötelező-e hozzáadni egy BOM-ot (az elején). Az UTF-16 két ízzel rendelkezik, amelyek szerint a bájt az első. Vagy akár rendelkezhet UTF-32-vel. A iconv -l ezeket felsorolja:

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// 

Az “LE” és a “BE” kis és nagy végekre utal a bájtsorrendhez. A Windows az “LE” ízeket használja, és az iconv valószínűleg azt feltételezi, hogy azoknál az ízeknél, amelyekből hiányzik az “LE” vagy a “BE”.

Ezt egy oktál segítségével láthatja. (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 

Ha az UTF-16LE-t feltételezzük, a

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

Megjegyzések

  • Tehát hogyan konvertálhatom a fájlt utf-8-ra, szándékom szerint bármilyen formátumot (forrásból származó) konvertálok utf-8-ra.
  • @St é phaneChazelas, @ Thomas hogyan találhatom meg a forráskódolást, nem működik ' az utf- 32 (le / be) | 16 (le / be). Van-e parancs a forrásfájl kódolásának megkeresésére?
  • Amint azt javasoltuk, egy oktális dump megjelenítése tanácsokkal segítene …
  • @St é phaneChazelas Az alábbiak működtek, de mit csinál " NUL " jó eltávolítani ?? macska fájlnév.csv | tr -d ' \ 000 ' > out.csv fájl -bi out.csv szöveg / sima; charset = utf-8
  • @WilliamR, ezek a NUL bájtok a csv fájlban valószínűleg egy szélesebb probléma jelzésére szolgálnak, például a fájl valamilyen módon sérült, mivel a szöveges fájlban nem várható ilyen, és hogy ' s, amire érdemes figyelnie. Nézze meg, hol jelennek meg a csv fájlban (bár ^@ néven kell megjeleníteni a vim fájlban), és ellenőrizze, hogy a körülötte lévő adatok érvényesek-e.

Válasz

strings (a binutils-ból származik) ” nyomtassa ki a nyomtatható karakterláncokat fájlokban “, ha iconv és recode is sikertelen volt, a file továbbra is bináris adatként jelenti a tartalmat:

$ 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 

Megjegyzések

  • strings nem őrzi meg az üres sorokat. Ettől eltekintve elvégzi a munkát.
  • @vulcanraven a -w (--include-all-whitespace) opció új sorokat és kocsit tartalmaz visszatér,

válasz

https://pypi.python.org/pypi/chardet segítségével meghatározhatja a szöveg kódolását, majd átalakíthatja abból a kívántra.

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

Míg file -i nyomtat

application/octet-stream; charset=binary 

chardet helyesen érzékeli

ascii with confidence 1.0 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük