レガシーシステムからデータファイルを受け取り、処理してデータベースにロードします。入力ファイル(input.txtなど)は、2つの部分に分かれています。最初はデータ列、2番目は数値列です。このファイルで行う処理は、一部のデータ列を削除し、残りの列の数値を集計して(各レコードが一意のレコードになるようにする)ことです。Perl - レコードを集約して印刷できる汎用サブルーチン
タブ区切り入力ファイルINPUT.TXTを以下に示す(column4にCOLUMN0 COLUMN7にデータ列とCOLUMN5は数字列されている):
a b c h n 1.99 2.99 9
a b c k q 100 100 10
a b c m s 9.99 8.99 11
a b d i o 0.01 0.01 12
a b d j p -12.19 11.11 13
a b e l r 9 9 14
タブ区切り出力ファイルoutput.txtとが示されています以下のperlスクリプトは、column0、column1、column2を保持することで数値を集計します。スクリプトは正常に動作しています。
use strict;
my $INPUT_FILE=shift @ARGV || die "You must supply the input as the first argument!!!\n";
my $OUTPUT_FILE=shift @ARGV || die "You must supply the output file as the second argument!!!\n";
open(my $out, ">", $OUTPUT_FILE) or die "Cannot open $OUTPUT_FILE for writing!\n";
open(my $in, "<", $INPUT_FILE) or die "Cannot open $INPUT_FILE for processing!\n";
my $data;
while (<$in>)
{
s/\r?\n$//;
my @cols = split(/\t/);
$data->{$cols[0]}->{$cols[1]}->{$cols[2]}->[0] += $cols[5];
$data->{$cols[0]}->{$cols[1]}->{$cols[2]}->[1] += $cols[6];
}
close $in;
foreach my $lev1 (sort keys %{$data})
{
foreach my $lev2 (sort keys %{$data->{$lev1}})
{
foreach my $lev3 (sort keys %{$data->{$lev1}->{$lev2}})
{
my $dataVal = $data->{$lev1}->{$lev2}->{$lev3}->[0];
my $dataVal2 = $data->{$lev1}->{$lev2}->{$lev3}->[1];
print $out "$lev1\t$lev2\t$lev3\t$dataVal\t$dataVal2\n";
}
}
}
close $out;
質問:多くの異なるperlスクリプトで同じロジックを適用します。私は、 "require"ステートメントを使用して、すべての異なるスクリプトでソースできる汎用サブルーチンを作成したいと思います。サブルーチンは、出力を集約して出力する必要があります。このサブルーチンでは、集計に必要な列(現在はcolumn0からcolumn2)と集計する列の数(現在はcolumn5とcolumn6)について引数を受け入れる必要があります。ご意見をお聞かせください。
Perlモジュールを書く方法を聞いていますか?もしあなたがそうであれば、あなたは非常にラウンドアバウトなやり方でそれをやっています。 http://perldoc.perl.org/perlmod.html –
を参照してください。いいえ、サブルーチンが必要です。私たちはサブルーチンのライブラリを持っており、この新しいサブルーチンを追加します。 – sachin
これまでサブルーチンの書いた内容と、問題を解決したことをうまくやってくれたことを教えてください。だから私は私の仕事をしないので、私は給料を得ることができます "サイトです。 – DVK