2012-02-25 3 views
0

UNIXスタイルのエンディングでUTF-16リトルエンディアンでエンコードされた1Gbのテキストファイルをperlでストリーム処理する必要があります(0x000Aを含まない0x000Aのみストリーム内)とLE BOMの最初の部分です。ファイルはWindows上で処理されます(Unixソリューションも必要です)。ストリームプロセスとは、while(<>)、行ごとの読み書きを使用することを意味します。 次のようなコマンドラインを使用するといいでしょう:
perl -pe "BEGIN {SOME_PREPARATION}; s/SRC/DST/g;" infile.txt>テストのための入力のWindows perlでBOMとUnixの行末を持つストリームプロセスUTF-16ファイル

ヘキサ・ダンプ(二行:それぞれの "a" および "b" の文字):Outfile.txtを FF FE 61 00 0A 00 62 00 0A 00

FF FE 61 00 0A 00 63 00 0A 00

PS:S/B/C/G

処理( "C" に置き換え、 "B")出力を与えるべきです。今はすべての試行でCRLF出力に問題があります(0D 0Aバイトが出力され、不正なユニコード記号が出力され、同じUnixスタイルを維持するために0D00なしで0A00が必要です)。 1行では奇数行で6100、出力では偶数行で0061です。

perl -pe "BEGIN { binmode $_, ':raw:encoding(UTF-16LE)' for *STDIN, *STDOUT }; s/b/c/g;" <infile.txt >outfile.txt 

しかし、私は、ファイルがSTDIN上になるように<infile.txtの代わりinfile.txtを使用していたことに注意してください:

+0

Perl 5.what?いくつかの違いがあり、あなたの答えが正しいかどうかを確認したいと思います。 – ikegami

+0

これは難しい理由は、Perlが追加する:crlfを追加する前に:エンコーディング(UTF-16le)をハンドルに追加し、それらを間違った順序で配置するからです。 – ikegami

+0

@ikegamiあなたは説明することができます:crlfの使用法? ":crlf:encoding(UTF-16LE)"のように表示されている場合はどうなりますか? –

答えて

3

私が思い付くした最高のはこれです。理論的には、openプラグマは、魔法のARGVファイルハンドルで使用されるエンコーディングを制御する必要がありますが、この場合正しく動作するようにはできません。

<infile.txtinfile.txtの違いは、ファイルを開く方法と時期です。 <infile.txtでは、ファイルは標準入力に接続され、Perlの実行が開始される前に開かれます。 BEGINブロックのbinmode STDINにファイルが既に開いていて、エンコードを変更できます。

infile.txtを使用すると、ファイル名はコマンドライン引数として渡され、@ARGVアレイに配置されます。 BEGINブロックが実行されると、そのファイルはまだ開いていないので、エンコードを設定することはできません。理論的には、あなたが言うことができるはずである:

use open qw(:std IO :raw:encoding(UTF-16LE)); 

と魔法<ARGV>処理を持っているが、右のエンコーディングを適用します。しかし、私はこの場合には正しく機能するようにはできませんでした。

+0

うわー!よく働く! :)ありがとう@cjm。私が今試してみたように、私のコードの問題の主な問題は、infile.txtの前に "<"がないことでした。なぜそれが必要なのか、どのような違いがあるのか​​説明できますか? STDINでなければ、ファイルは "<"なしでリダイレクトされます。 'perl -pe "print" file.txtは、file.txtがスクリプト内のSTDINにあるかのようにうまくいきます... BTW、ここではスクリプトでUTF-16LEとUTF-16の違いは何ですか? –

+0

なぜ ':raw'ですか?また、私はいつも ':utf8'とmagic' ARGV'を使って 'open 'を使います。 – tchrist

+0

@tchrist、私は ':raw'を使用していました。なぜなら、彼はWindows上で、Perlはデフォルトで':crlf'を追加していますが、Unixの行末で出力したいからです。私は ':crlf'を削除する良い方法を知らない。 – cjm

関連する問題