2011-05-06 3 views
6

私はレガシープログラムを持っており、実行後にログファイルを生成します。今私はこのログファイルを分析する必要があります。どのようにユニコードに似た形式のファイルを処理するためにperlを使用しますか?

しかし、ファイル形式は非常に奇妙です。以下を参照してください、私はそれを開くためにviを使いました、それはUnicodeファイルのように見えますが、FFFEが起動していません。メモ帳を開いて保存してからもう一度開くと、FFFEがメモ帳で追加されていることがわかりました。その後、コマンド 'type log.txt> log1.txt "を使用してファイル全体をANSI形式に変換できます。後でperlで/ TDD /を使用して、必要なものを検索することができます。

今、このファイル形式を扱うことができません。

任意のコメントやアイデアは非常に理解されるであろう。

0000000: 5400 4400 4400 3e00 2000 4c00 6f00 6100 T.D.D.>. .L.o.a. 

をメモ帳した後、それは

0000000: fffe 5400 4400 4400 3e00 2000 4c00 6f00 ..T.D.D.>. .L.o. 

open STDIN, "< log.txt"; 
while(<>) 
{ 
    if (/TDD/) 
    { 
    # Add my logic. 
    } 
} 

私は非常に便利ですスレッドを読んだことがある保存、まだできません私の問題を解決してください。 How can I open a Unicode file with Perl?

回答を追加できないため、スレッドを編集します。

ありがとうございますMichael、 私はあなたのスクリプトを試しましたが、次のエラーがありました。

perl.exe open.pl utf-16le utf-16 <my log file>.txt 

が、私はまだエラーを得た:私は、OSがWindows 2008

* ascii 
* ascii-ctrl 
* iso-8859-1 
* null 
* utf-8-strict 
* utf8 
UTF-16:Unrecognised BOM 5400 at test.pl line 12. 

更新

私はコマンドを使用してUTF-16LEを試している、私のperlのバージョンは5.1で確認しましたlike

UTF-16LE:Partial character at open.pl line 18, <$fh> line 1824. 

また、私はutf-16beを試してみましたが、同じe不具合私は、UTF-16を使用した場合

は、私はエラー

UTF-16:Unrecognised BOM 5400 at open.pl line 18. 

open.plライン18

is "print while <$fh>;" 

任意のアイデアを得たのだろうか?

更新日:2011/11/05 ご協力いただきありがとうございます。私は問題を解決しました。 ログファイルのデータは結局UTF-16ではないことがわかりました。だから、私はVisual Studioで.netプロジェクトを書く必要がありました。 UTF-16でログファイルを読み取り、UTF-8で新しいファイルに書き込みます。そして、私はファイルを解析し、結果データを生成するためにperlスクリプトを使用しました。それは今働いた。

だから、ごみのデータが多いファイルを読む方法を知っている人がいらっしゃる場合は、どうもありがとうございます。

それを開くためにゴミデータサンプル

tests.cpp:34) 
਍吀䐀䐀㸀 䰀漀愀搀椀渀最 挀挀洀挀漀爀攀⸀搀氀 

使用の六角リーダー:

0000070: a88d e590 80e4 9080 e490 80e3 b880 e280 ................ 
0000080: 80e4 b080 e6bc 80e6 8480 e690 80e6 a480 ................ 
0000090: e6b8 80e6 9c80 e280 80e6 8c80 e68c 80e6 ................ 
00000a0: b480 e68c 80e6 bc80 e788 80e6 9480 e2b8 ................ 
+0

これは何らかの助けになるかもしれません。http://www.perlmonks.org/?node_id=615796 –

+0

ストリームの読み込みに異なるエンコードを指定しようとしましたか? –

+0

あなたがリンクした質問の答えは、あなたのUCS-2LEでエンコードされたファイルを読むために必要なことを正確に伝えています。私はちょうどそれを試して、それは私のために働いた。 - あなたが「解決できない」理由を特定してください。 – daxim

答えて

6

あなたのファイルは、UTF-16LEでエンコードされているようです。メモ帳が追加するバイトは、「Byte Order Mark」またはBOMだけと呼ばれます。ここで

あなたはPerlを使ってファイルを読むことができる方法は次のとおりです。

use strict; 
use warnings; 
use Encode; 
# list loaded encodings 
print STDERR map "* $_\n", Encode->encodings; 
# read arguments 
my $enc = shift || 'utf16'; 
die "no files :-(\n" unless @ARGV; 
# process files 
for (@ARGV) { 
    open my $fh, "<:encoding($enc)", $_ or die "open $_: $!"; 
    print <$fh>; 
    close $fh; 
} 
# loaded more encodings now 
print STDERR map "* $_\n", Encode->encodings; 

は、あなたのファイルのための正しいエンコーディングを供給するように注意しながら、このように実行します。

perl open.pl utf16 open.utf16be.txt 
perl open.pl utf16 open.utf16le.txt 
perl open.pl utf16le open.utf16le.nobom.txt 

ここtchristの提案、次の改訂版です:

use strict; 
use warnings; 
use Encode; 

# read arguments 
my $enc_in = shift || die 'pass file encoding as first parameter'; 
my $enc_out = shift || die 'pass STDOUT encoding as second parameter'; 
print STDERR "going to read files as encoded in: $enc_in\n"; 
print STDERR "going to write to standard output in: $enc_out\n"; 
die "no files :-(\n" unless @ARGV; 

binmode STDOUT, ":encoding($enc_out)"; # latin1, cp1252, utf8, UTF-8 

print STDERR map "* $_\n", Encode->encodings; # list loaded encodings 

for (@ARGV) { # process files 
    open my $fh, "<:encoding($enc_in)", $_ or die "open $_: $!"; 
    print while <$fh>; 
    close $fh; 
} 

print STDERR map "* $_\n", Encode->encodings; # more encodings now 
+0

マイケルに感謝します。私は試しましたが、 'UTF-16:test.pl 12行目で認識できないBOM 5400 'のようなエラーがありました。 'print <$fh>;' – Orionpax

+1

@Orionpaxの行、Perlでは、 'utf16'エンコーディングはBOMを期待しています。なぜなら、それはビッグエンディアンかリトルエンディアンかもしれないからです。代わりに 'UTF-16LE'を使用してみてください。 – cjm

+0

その後、BOMのないファイルで実行しました。私の例を更新するつもりです。 – Lumi

関連する問題