2011年4月25日月曜日

perlでエラーログを抽出する

最近、仕事でデータをインポートする作業が多くなっています。
1000件、2000件ともなると、エラーが置きたさいにデータの確認が大変です。

エラーのデータだけを抽出したcsvを出力することで、どのようなデータでERRORが起きるのかの把握で時間短縮ができるのでは?と思い、Perlで実装しました。

インポートの際には、下のようなログがでます。
SUCCESS line no. 1 ...
ERROR line no. 2 ...

実装としては、
*csvファイルとログテキストを同じ階層に配置させておく。
*ログテキストを読んで、ERRORの後の番号(行数)を配列として保存する
*CSVファイルを読んで、上で保存した番号(行数)のデータだけを新規のCSVとして出力する



#!usr/bin/perl

use strict;
use warnings;

## register files
print "log_txt : ";
chomp(my $log_txt = <STDIN>);
print "csv : ";
chomp(my $csv = <STDIN>);
print "exporter_csv : ";
chomp(my $export_csv = <STDIN>);

## data of culumn for csv
my @error_num = ("0");

## run
my $error_data = &error_data_number();
my $create_csv = &create_csv_with_error_data();
print "compleate!\n";


## stored number of error data
sub error_data_number {
        open IN, '<', $log_txt or die "file open error: $!";

        while(<IN>) {
                chomp;
                if (/(ERROR line no. )(\d+)/) {
                        push(@error_num, $2);
                }
        }
        close IN;
}


## create csv with error data
sub create_csv_with_error_data {
        open IN, '<', $csv or die "$csv file open error: $!";
        open OUT, '>', $export_csv or die "$export_csv file open error: $!";

        my @data = <IN>;
        while (@error_num) {
                my $fred = shift(@error_num);
                print OUT $data[$fred];
        }

        close IN;
        close OUT;
}


ここ最近Perlを勉強中ですが、たいていのことはPerlで実装できるんだな、と感じてきました。
Linuxでは標準でインストールされていて、使い勝手の良い言語なだけに、インフラ屋は、Perlを理解して使いこなすことで、作業効率が上がります。

勉強もかねて、作業を効率にさせてくれるものは、どんどん実装していこうと思います。
とくに自動化できるところは、押し進めていきたいです!


0 件のコメント:

コメントを投稿