固定長ファイルに、受注のデータが格納されています。

そのレコードの中の例えば60バイト目から70バイト目までが品番になっています。
そのファイルの中の品番ごとのレコード数を集計したいのですが、やり方が分からなくて困っています。
品番は不特定多数なのですが、レコード数をどのようにカウントしていけばいいのか、教えていただけますか?。

結果が

品番 数
1001121019 12
A001121019 20
B001121019 7
C001121019 99
D001121019 2

のようにログに出せるようにしたいのです。


インプットになる固定長ファイルごとに、品番の出現バイトが異なっていて、
今考えているのは、
60 70 hoge.dat
100 110 hoge2.dat
90 100 hoge3.dat

のようなconfigファイルを読み込んで、ファイルを開くような仕様にしたいと思っています。

使用できるのは、kshもしくはPerlのみです。
誰かご教授いただければと思います。

よろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:2007/03/01 09:36:17
  • 終了:2007/03/01 18:51:49

ベストアンサー

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/03/01 09:54:04

ポイント30pt
#!/usr/bin/perl

use strict;

my %config = ();
my %count  = ();

parse_config($_) for @ARGV;
foreach my $data ( keys %config ) {
  open_file( $data, $config{$data} );
}
print_result();

sub parse_config {
  my $file = shift;
  open CONFIG, "<$file" or die "Can't open config: $file";
  while ( defined ( my $line = <CONFIG> ) ) {
    chomp $line;
    my ( $start, $end, $data ) = split /\s+/ , $line;
    $config{$data} = { start => $start, end => $end, };
  }
  close CONFIG or die "Can't close config: $file";
}

sub open_file {
  my ( $file, $config ) = @_;
  open FILE, "<$file" or die "Can't open file: $file";
  while ( defined ( my $line = <FILE> ) ) {
     chomp $line;
     my $id = substr ( $line, $config->{start}, $config->{end} );
     $count{$id}++;
  }
  close FILE or die "Can't close file: $file";
}

sub print_result {
  foreach my $id ( sort keys %count ) {
    print "$id $count{$id}\n";
  }
}

確認はしていない。

id:himat1974

すいません、このプログラムに対して、configファイルはどのように引き渡せばいいですか?

引数?

2007/03/01 15:52:39

その他の回答(2件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/03/01 09:54:04ここでベストアンサー

ポイント30pt
#!/usr/bin/perl

use strict;

my %config = ();
my %count  = ();

parse_config($_) for @ARGV;
foreach my $data ( keys %config ) {
  open_file( $data, $config{$data} );
}
print_result();

sub parse_config {
  my $file = shift;
  open CONFIG, "<$file" or die "Can't open config: $file";
  while ( defined ( my $line = <CONFIG> ) ) {
    chomp $line;
    my ( $start, $end, $data ) = split /\s+/ , $line;
    $config{$data} = { start => $start, end => $end, };
  }
  close CONFIG or die "Can't close config: $file";
}

sub open_file {
  my ( $file, $config ) = @_;
  open FILE, "<$file" or die "Can't open file: $file";
  while ( defined ( my $line = <FILE> ) ) {
     chomp $line;
     my $id = substr ( $line, $config->{start}, $config->{end} );
     $count{$id}++;
  }
  close FILE or die "Can't close file: $file";
}

sub print_result {
  foreach my $id ( sort keys %count ) {
    print "$id $count{$id}\n";
  }
}

確認はしていない。

id:himat1974

すいません、このプログラムに対して、configファイルはどのように引き渡せばいいですか?

引数?

2007/03/01 15:52:39
id:rudeboyjet No.2

rudeboyjet回答回数11ベストアンサー獲得回数12007/03/01 09:59:53

ポイント30pt

やっつけですけどこんな感じでどうでしょうか?

#!/usr/bin/perl                                                                 
use Data::Dumper;
my ($start, $end, $file) = @ARGV ;

open(FP, $file) or die "Can't Open File";
my $result = {};
while(my $line = <FP>){
    my $item_number = substr($line, $start, $end);
    if($result->{$item_number}){
        $result->{$item_number} ++;
    } else {
        $result->{$item_number} = 1;
    }
}
print Dumper($result);
id:j_kimi No.3

j_kimi回答回数32ベストアンサー獲得回数42007/03/01 13:37:20

ポイント30pt

こんな感じではどうでしょうか。

$inp_name = "INPUTファイル名";
$cfg_name = "CONIGファイル名";

open(CFG,$cfg_name);
while	(<CFG>)	{
	@tmp	=	split(/ /,$_);
	if	($tmp[2] eq $inp_name){
		$wk_for = $tmp[0];
		$wk_num = $tmp[1] - $tmp[0] + 1;
        }
}
close(CFG);

open(INPUT,$inp_name);
while	(<INPUT>){
	$wk_itemno = substr($_,$wkfor,$wk_num);
	$itemno{$wk_itemno}	++;
}
close(INPUT);

while (($name, $value) = each(%itemno)) {
	print "$name $value\n";
}

キーが60バイト目から70バイト目って事は

キーの長さ自体は11バイトですよね?

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません