バイナリ文字セットの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
コメント
回答
“バイナリ “は エンコーディング (文字セット名)ではありません)。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では
^@
と表示されるはずですが)、その周囲のデータが有効かどうかを確認します。
od -tc < yourfile.csv | head
の出力を質問に追加してください?od
出力は、BOMを含むUTF-8ファイルを示しています。file
がバイナリを報告するには、最初のセクションの後にテキスト以外の文字(少なくとも1つのNULバイトとそれに続くいくつかの非NULバイト)が必要です。