人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

結果が

品番数
100112101912
A00112101920
B0011210197
C00112101999
D0011210192

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


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

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

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

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

●質問者: himat1974
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:config dat hoge ksh Perl
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● b-wind
●30ポイント ベストアンサー
#!/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";
 }
}

確認はしていない。

◎質問者からの返答

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

引数?


2 ● rudeboyjet
●30ポイント

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

#!/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);

3 ● j_kimi
●30ポイント

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

$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バイトですよね?

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ