1

transcation.csv次のようなcsv ファイルがあります。

TransactionID,Date,AccNum,Type,Amt  
657520,02-07-1999,016901581432,Debit,16000  
657524,02-07-1999,016901581432,Debit,13000  
657538,09-07-1999,016901581432,Credit,11000  
657548,18-07-1999,016901581432,Credit,15500  
657519,02-07-1999,016901581433,Debit,12000  
657523,02-07-1999,016901581433,Credit,11000  
657529,03-07-1999,016901581433,Debit,15000  
657539,10-07-1999,016901581433,Credit,10000  
657541,11-07-1999,016901581434,Debit,12000  
657525,03-07-1999,016901581434,Debit,15000  
657533,05-07-1999,016901581434,Credit,12500  

からデータを読み取り、transaction.csvハッシュに保存することになっています。次に、アカウント番号のハッシュとリストを関数に渡し、ハッシュのデータを使用して、リストされたアカウントの合計借方金額と貸方金額を計算する関数を作成します。

これは私のコードです:

#!/usr/bin/perl

my %banks;
&arrhas_banks(\%banks);
my @accnum = qw(016901581432 016901581434);
hasarr_banks(\%banks,\@accnum);

sub arrhas_banks
{
  my $banks = shift;
  open(FH,"<transaction.csv") or die "Could not open 'transaction.csv' $!\n";
  while (my $data=<FH>) 
  {
    chomp($data);
    my @records = split ",", $data;
    $banks->{$records[0]} =
      { 'AccNum' => $records[2], 'Type' => $records[3], 'Amt' => $records[4] };
  }
  close(FH);
}

sub hasarr_banks {
  my ($banks, $accnum) = @_;
  foreach my $id (keys %{$banks}) {
    my $answer;
    foreach my $num (@{$accnum}) {
      if($banks->{$id}{'AccNum'} == $num) {
        $answer = 1;
      }
    }
    if($answer) {
      my $type = $banks->{$id}{'Type'};
      $total{$accnum}{$type} += $banks->{$id}{'Amt'};
    }
  }
  foreach my $no (@{$accnum}} { 
    print "Debit amount of $no is $total{$accnum}{'Debit'}";
    print "Credit amount of $no is $tot{$accnum}{'Credit'}";
  }
}

次のような出力を生成することになっています。

Debit amount of 016901581432 is 29000  
Credit amount of 016901581432 is 26500  
Debit amount of 016901581434 is 27000  
Credit amount of 016901581434 is 12500    

しかし、私は次のような出力を得ています:

Debit amount of 016901581432 is 56000    
Credit amount of 016901581432 is 39000  
Debit amount of 016901581434 is 56000  
Credit amount of 016901581434 is 39000  

私は何を間違っていますか?


#!/usr/bin/perl

my %banks;
&arrhas_banks(\%banks);
my @accnum = qw(016901581432 016901581434);
hasarr_banks(\%banks,\@accnum);

sub arrhas_banks
{
  my $banks = shift;
  open(FH,"<transaction.csv") or die "Could not open 'transaction.csv' $!\n";
  while (my $data=<FH>) 
  {
    chomp($data);
    my @records = split ",", $data;
    $banks->{$records[0]} =
      { 'AccNum' => $records[2], 'Type' => $records[3], 'Amt' => $records[4] };
  }
  close(FH);
}

sub hasarr_banks {
  my ($banks, $accnum) = @_;
  foreach my $id (keys %{$banks}) {
    my $answer;
    foreach my $num (@{$accnum}) {
      if($banks->{$id}{'AccNum'} == $num) {
        $answer = 1;
      }
    }
    if($answer) {
      my $type = $banks->{$id}{'Type'};
      $total{ $banks->{$id}{'AccNum'} }->{$type} += $banks->{$id}{'Amt'};
    }
  }
  foreach my $no (@{$accnum}) { 
    print "Debit amount of $no is $total{$accnum}{'Debit'}";
    print "Credit amount of $no is $total{$accnum}{'Credit'}";
  }
}                      

まだ出力がありません。まだうまくいかない?

4

2 に答える 2

1

あなたは二重に数えています。

このコードは 2 つの場所で壊れています。

  1. まず、サンプル データの AccNum は常に$accnumリスト内の 2 つのアカウントの 1 つであるため、$answer は常に 1 になります。

    foreach my $num (@{$accnum}) { if($banks->{$id}{'AccNum'} == $num) { $answer = 1; } }

  2. 次に、キーに$total基づいて割り当てています-しかし、これはアカウント番号のリストへの配列参照です-サブルーチン呼び出しを見てください。$accnum$accnum

    言い換えれば、あなたの$totalhashref は、アカウントごとに 1 つの 2 つのキーではなく、"ARRAY(SOMETHING)" のように見える 1 つのキーのみを持つことになります。

あなたがする必要があるのは、正しいアカウント番号に割り当てるだけです:

if ($answer) {
  my $type = $banks->{$id}{'Type'};
  $total{ $banks->{$id}{'AccNum'} }->{$type} += $banks->{$id}{'Amt'};
}

余談ですが、あなたのコードスタイルは読みやすさに関してはあまり良くありません。私が見た中で最悪ではありませんが、間違いなく理想に近いものではありません.

于 2012-09-29T16:53:40.753 に答える