Převést binární kódování, které může hlava a Poznámkový blok číst na UTF-8

Mám soubor CSV, který je v binární znakové sadě, ale musím převést na UTF- 8 ke zpracování v HDFS (Hadoop).

Ke kontrole znakové sady jsem použil následující příkaz.

file -bi filename.csv 

Výstup:

application/octet-stream; charset=binary 

když se pokusím převést soubor z binárního na UTF-8, vyvolá to chybu.

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

může mi někdo pomoci, abych pochopil, zda je možné převést nebo ne, vidím data pomocí příkazu head.

Co to znamená, binární znamená nečitelný, ale jak příkaz head nebo poznámkový blok může data číst.

od -tc < název souboru.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 

Komentáře

  • Můžete prosím přidejte výstup od -tc < yourfile.csv | head k vaší otázce?
  • soubor -bi ukazuje svůj binární znak, Když zkontroluji z Vi set znakové kódování ukazuje utf-8.
  • Tento od výstup zobrazuje soubor UTF-8 s kusovníkem. Aby file mohl hlásit binární soubory, musí být za první sekcí nějaké netextové znaky (pravděpodobně alespoň jeden bajt NUL následovaný některými bajty jinými než NUL).
  • Odstranil jsem všechny " NUL " poté, co se soubor -bi zobrazí jako utf-8, doufám, že " NUL " nebude problém.

Odpovědět

“ binární „není kódování (název znakové sady ). iconv potřebuje pro svou práci název kódování.

Obslužný program file neposkytuje užitečné informace, pokud nerozpozná formát souboru. může být UTF-16 například bez značky pro kódování bajtů (BOM). notepad to přečte. Totéž platí pro UTF-8 (a head zobrazí to protože váš terminál může být nastaven na o kódování UTF-8, a to by se nestaral o kusovníku).

Pokud je soubor UTF-16, váš terminál by to zobrazil pomocí head protože většina znaků by byla ASCII (nebo dokonce Latin-1), což by znamenalo, že by „ostatní“ bajty znaků UTF-16 byly nulové.

V obou případech bude nedostatek kusovníku (v závislosti na verze file) to zaměňujte. Jiné programy však mohou fungovat, protože tyto formáty souborů lze použít v systému Microsoft Windows i v přenosných aplikacích, které mohou běžet v systému Windows.

Chcete-li soubor převést na UTF-8, musíte vědět, které kódování jej používá použití a jaký je název pro toto kódování s iconv. Pokud už je to UTF-8, pak to, zda přidáte kusovník (na začátku), je volitelné. UTF-16 má dvě příchutě, podle kterých je bajt první. Nebo můžete dokonce mít UTF-32. iconv -l uvádí tyto:

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“ a „BE“ označují malé a velké konce pro pořadí bajtů. Windows používají příchutě „LE“ a iconv pravděpodobně předpokládá, že pro příchutě, které postrádají „LE“ nebo „BE“.

Toto můžete vidět pomocí osmičkové (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 

Za předpokladu UTF-16LE můžete převést pomocí

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

Komentáře

  • Jak tedy mohu převést soubor na utf-8, mým záměrem je převést libovolný formát (pochází ze zdroje) na utf-8.
  • @St é phaneChazelas, @ Thomas, jak najdu zdrojové kódování, ' nefunguje pro utf- 32 (le / be) | 16 (le / be). Existuje nějaký příkaz k vyhledání kódování zdrojového souboru?
  • Jak bylo navrženo, zobrazení osmičkové skládky by pomohlo s radou …
  • @St é phaneChazelas Níže fungovalo, ale co " NUL " je dobré odstranit ?? název souboru kočky.csv | tr -d ' \ 000 ' > soubor out.csv -bi out.csv text / prostý; charset = utf-8
  • @WilliamR, ty bajty NUL ve vašem souboru csv jsou pravděpodobně známkou širšího problému, jako by byl soubor nějakým způsobem poškozen, protože se v textovém souboru neočekávají, a že ' na co byste se měli dívat. Podívejte se, kde se v souboru csv objevují (měl by se však ve vimu zobrazit jako ^@) a zkontrolujte, zda jsou údaje kolem něj platné.

Odpověď

strings (z binutils) uspěje “ vytisknout řetězce tisknutelných znaků v souborech „když selhaly iconv a recode s file stále hlásí obsah jako binární 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 

Komentáře

  • strings nezachovává prázdné řádky. Kromě toho to dělá svou práci.
  • @vulcanraven -w (--include-all-whitespace) možnost obsahuje nové řádky a přepravu vrátí,

odpověď

https://pypi.python.org/pypi/chardet lze použít k určení kódování textu, z kterého můžete převést na to, co potřebujete.

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

Zatímco file -i tiskne

application/octet-stream; charset=binary 

chardet správně detekuje

ascii with confidence 1.0 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *