ヘッドとメモ帳で読めるバイナリエンコーディングをUTF-8に変換

ヘッドとメモ帳で読めるバイナリエンコーディングをUTF-8に変換

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

次のコマンドを使用して文字セットを確認します。

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 <ファイル名.csvヘッダー|

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

答え1

「バイナリ」はそうではありませんコーディング(文字セット名). iconvが操作を実行するには、エンコード名が必要です。

fileユーティリティがファイル形式を認識しない場合は、有用な情報を提供しません。たとえば、UTF-16バイトエンコード表示(BOM)がない可能性があります。 notepadお読みください。同様に適用されますUTF-8head表示されます。それ端末がUTF-8エンコーディングに設定されていて、BOMは気にしないからです。

headファイルがUTF-16の場合、ほとんどの文字はASCII(Latin-1も含む)で、UTF-16文字の「その他」バイトは空であるため、端末はファイルを表示します。

どちらの場合も、バージョンによっては欠落している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

答え2

stringsiconv(binutilsで)両方が失敗しrecodeた場合は、「ファイルに印刷可能な文字列を印刷」しますが、それでも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

答え3

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

答え4

まず、このコマンドを使用してファイルのMIMEタイプを確認したいと思います。

file -b --mime-type <yourfile>
file -b <yourfile>

確認後、application/octet-streamこのコマンドを入力してください。cat <yourfile> | tr -d '\0' > <yournewfile>

関連情報