バイナリ文字セットを含む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-8
(head
表示されます。それ端末が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
strings
iconv
(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>