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]

Reply via email to