Shiping Wang wrote:
>
> Hi , I have following a record file like this:
>
> [snipped data. see below]
>
> What I want output is:
>
> Cust Prod Cata
> 1711
> 842 1523 C
> 9306 152 B
> 24727 15225 A
> 46917 9828 B
> 50 4309 C
>
> For each customer, I only select one product based on an order of B, C, A,
> D.
>
> I thought I might use some kind of data structure like AOA or HOH, but don't
> know how. Can anyone give me a help to use perl to handle this case?
Here is one way to do it (given the supplied data):
#!/usr/bin/perl -w
use strict;
my ( %data, $cust, $prod );
while ( <DATA> ) {
if ( /^Customer ID:\s*(\d+)/ or eof ) {
$cust = $1;
}
elsif ( /^\s+Product ID:\s*(\d+)/ ) {
$prod = $1;
}
elsif ( /^\s+Category:\s*(\S+)/ ) {
$data{$cust}{$prod} = $1;
}
else {
$data{$cust}{''} = '';
}
}
for $cust ( keys %data ) {
for $prod ( keys %{$data{$cust}} ) {
printf "%-8s%-8s%s\n", $cust, $prod, $data{$cust}{$prod};
}
}
__DATA__
Customer ID: 1711
* * * No record * * *
Customer ID: 842
Product ID: 716
Category:A
Product ID: 1523
Category:C
Product ID: 753
Category:D
Product ID: 76
Customer ID: 9306
Product ID: 152
Category:B
Product ID: 34762
Category:D
Product ID: 1956
Category:D
Customer ID: 24727
Product ID: 15225
Category:A
Product ID: 9615
Category:D
Customer ID: 46917
Product ID: 20401
Category:A
Product ID: 9828
Category:B
Product ID: 665
Category:C
Product ID: 461
Category:D
Product ID: 1335
Customer ID: 50
Product ID: 19554
Category:A
Product ID: 4309
Category:C
Output:
46917 665 C
46917 461 D
46917 9828 B
46917 20401 A
9306 34762 D
9306 152 B
9306 1956 D
24727 9615 D
24727 15225 A
1711
50 19554 A
842 1523 C
842 716 A
842 753 D
John
--
use Perl;
program
fulfillment
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]