ヘッドとメモ帳が読み取ることができるバイナリエンコーディングをUTF-8に変換します

バイナリ文字セットのCSVファイルがありますが、UTFに変換する必要があります- 8をHDFS(Hadoop)で処理します。

以下のコマンドを使用して文字セットを確認しました。

file -bi filename.csv 

出力:

application/octet-stream; charset=binary 

ファイルをバイナリからUTF-8に変換しようとすると、エラーがスローされます。

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

変換が可能かどうか、headコマンドを使用してデータを表示できるかどうかを理解するのを手伝ってくれませんか。

どういう意味ですか、バイナリは読み取り不能を意味しますが、ヘッドコマンドまたはメモ帳はデータを読み取ることができます。

od -tc < filename.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 

コメント

  • できますかod -tc < yourfile.csv | headの出力を質問に追加してください?
  • ファイル-biはそのバイナリ文字を示しています。Viセットからチェックすると、文字エンコードはutf-8を示しています。
  • そのod出力は、BOMを含むUTF-8ファイルを示しています。 fileがバイナリを報告するには、最初のセクションの後にテキスト以外の文字(少なくとも1つのNULバイトとそれに続くいくつかの非NULバイト)が必要です。
  • ファイル-biがutf-8と表示された後、すべての" NUL "を削除しました。 NUL "は問題になりません。

回答

“バイナリ “は エンコーディング (文字セット名)ではありません)。iconvは、その仕事をするためにエンコーディング名を必要とします。

fileユーティリティは、ファイル形式を認識しない場合、有用な情報を提供しません。たとえば、バイトエンコーディングマーク(BOM)がない場合はUTF-16になります。notepadはそれを読み取ります。同じことが

(およびheadは、端末がtに設定されている可能性があるため、 を表示します。 o UTF-8エンコーディングであり、BOMを気にしません。

ファイルがUTF-16の場合、端末はheadを使用してそれを表示します。ほとんどの文字はASCII(またはLatin-1)であり、UTF-16文字の「他の」バイトをnullにします。

いずれの場合も、BOMがない場合は( file)のバージョンはそれを混乱させます。ただし、他のプログラムも機能する可能性があります。これらのファイル形式は、Microsoft Windowsだけでなく、Windowsで実行できるポータブルアプリケーションでも使用できるためです。

ファイルをUTF-8に変換するには、ファイルのエンコードを知る必要があります。を使用し、そのエンコーディングの名前はiconvを使用します。すでにUTF-8である場合、BOMを(最初に)追加するかどうかはオプションです。 UTF-16には、どちらのバイトが最初であるかによって、2つのフレーバーがあります。または、UTF-32を 持つこともできます。 iconv -lには次のリストがあります。

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」と「BE」はリトルエンドとビッグエンドを指しますバイトオーダーの場合。 Windowsは「LE」フレーバーを使用します。iconvは、「LE」または「BE」がないフレーバーを想定している可能性があります。

これは8進数を使用して確認できます。 (原文のまま)ダンプ:

$ 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 

UTF-16LEを想定すると、

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

<を使用して変換できます。 h3>コメント

  • ファイルをutf-8に変換するにはどうすればよいですか。私の意図は、任意の形式(ソースから取得)をutf-8に変換することです。
  • @St é faneChazelas、@ Thomasソースエンコーディングを見つけるにはどうすればよいですか。' utfでは機能しません- 32(le / be)| 16(le / be)。ソースファイルのエンコーディングを見つけるコマンドはありますか?
  • 提案されているように、8進数のダンプを表示するとアドバイスが役立ちます…
  • @St é faneChazelas以下は機能しましたが、" NUL "を削除するのは良いことですか?? cat filename.csv | tr -d ' \ 000 ' > out.csvファイル-biout.csvテキスト/プレーン; charset = utf-8
  • @ WilliamR、csvファイル内のこれらのNULバイトは、テキストファイルでは予期されていないためにファイルが何らかの方法で破損したなど、より広範な問題を示している可能性があります。 'はあなたが見なければならないものです。それらがcsvファイルのどこに表示されるかを調べ(vimでは^@と表示されるはずですが)、その周囲のデータが有効かどうかを確認します。

回答

strings(binutilsから)は「 iconvrecodeの両方が失敗した場合、fileは引き続きコンテンツをバイナリデータとして報告します:

$ 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 

コメント

  • stringsは空の行を保持しません。それ以外は、それが仕事をします。
  • @vulcanraven -w--include-all-whitespace)オプションには、改行とキャリッジが含まれます戻り値、

回答

https://pypi.python.org/pypi/chardet を使用してテキストのエンコーディングを決定し、それから必要なものに変換できます。

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

file -iの印刷中

application/octet-stream; charset=binary 

chardetは正しく検出します

ascii with confidence 1.0 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です