web-dev-qa-db-ja.com

dos2unix:行1703で見つかったバイナリシンボル0x04

[〜#〜] oecd [〜#〜]http://stats.oecd.org/Index.aspx?datasetcode=CRS1 ( ' CRS 2013 data.txt ')[エクスポート]-> [関連ファイル]を選択します。このファイルをUbuntu(14.04 LTS)で操作したいと思います。

私が走るとき:

dos2unix CRS\ 2013\ data.txt

そうですか:

dos2unix: Binary symbol 0x0004 found at line 1703
dos2unix: Skipping binary file CRS 2013 data.txt

私はファイルのエンコーディングを次のようにチェックします:

file --mime-encoding CRS\ 2013\ data.txt

参照してください:

CRS 2013 data.txt: utf-16le

私がやります:

iconv -l | grep utf-16le

これは何も返さないので、私はします:

iconv -l | grep UTF-16LE

これは次を返します:

UTF-16LE//

それから私は走ります:

iconv --verbose -f UTF-16LE -t UTF-8 CRS\ 2013\ data.txt -o crs_2013_data_temp.txt

とチェック:

file --mime-encoding crs_2013_data_temp.txt

参照してください:

crs_2013_data_temp.txt: utf-8

それから私は試します:

dos2unix crs_2013_data_temp.txt

そして取得:

dos2unix: Binary symbol 0x04 found at line 1703
dos2unix: Skipping binary file crs_2013_data_temp.txt

それから私はそれを強制しようとします:

dos2unix -f crs_2013_data_temp.txt

これは機能します。つまり、dos2unixは救済/不満なしで変換を完了しますが、ファイルを開くと、「FoÄŤaandÄŚajniÄŤe」のようなエントリが表示されます。

私の質問はなぜですか? BOMがdos2unixに表示されないためですか?足りないから?私は正しく変換をしていませんか?このファイルを(正しく)変換して、読み取れるようにするにはどうすればよいですか?.

11
dw8547

ファイルに表示されている0x0004文字は、BOMとはまったく関係ありません(ちなみに、これは問題ありません)。これは、C0コントロールセットのEOT(End of Transmission)文字であり、そのコードポイントにあります。 7ビットASCIIが新しい注目度でした。(これはおなじみのControl-D Unix EOFシーケンスでもあります。)

残念ながら、ファイルがUTF-16であるため、trをファイルに適用してキャリッジリターンを削除するpre-dos2unixの方法は直接機能しません。ただし、iconvは機能するため、これを使用してUTF-8(trが機能します)に変換してから、次のtrコマンドを実行できます。

tr -d '\r' < crs_2013_data_temp.txt > crs_2013_data_unix.txt

テキストファイルをUnixの行末規則に入れるため。ただし、ファイルをフィードするツールに注意を払い、それら Ctrl-D/EOT文字で窒息しないようにする必要があります。もしそうなら、あなたは使うことができます

tr -d '\004' < crs_2013_data_unix.txt > crs_2013_data_clean.txt

それを取り除くために。

そもそもどうやってそこにたどり着いたのか?ベルギー人がOECDに提供したデータに忍び込ませたのは、おそらくcat - > fileまたは他の同様の圧倒的な手段で入力したものだと私は非難します。また、一部のテキストエディタは、制御文字を非表示にすることで少し役に立ちすぎようとしますが、他のツールは、しばらくの間テキストのふりをしていたバイナリファイルを詰め込んだと思って、制御文字を見ると救済されます。

5
LThode

このコマンドはあなたの問題には問題ないと思います:

cat file | tr -d "\r" > new_file
1
user8203542

それが私が解決した方法です:

find . -type f -exec sed -i 's/\r//' {} \;
0
Alex Skuratov