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
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
od -tc < yourfile.csv | head
k vaší otázce?od
výstup zobrazuje soubor UTF-8 s kusovníkem. Abyfile
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).