Hi Eelco,

If you're data file isn't excessively large, you might use the following
example. Otherwise, you should probably stuff you data file into a database
,such as CSV or mysql, and use the DBI (available at www.cpan.org) for
processing.

The following code reads in each line of $data_file, removes the trailing
newline, and splits the record into its corresponding fields on the pipe '|'
character. Each record is stored as an anonymous hash (i.e., hash reference)
in the @records array. The sorting is done with a single sort statement that
sorts records by the groep2 field ascending alphabetically. Output is in an
HTML table, but can be changed very easily.

I hope that helps.

Best regards,
David

__END__

#
# Read each line of $data_file, and store in the @records array.
#

my $data_file = 'Macintosh HD:Temp:data.txt';
my @records = ();

open(DATABASE, "< $data_file")
  or die "Can't open $data_file for reading: $!";

while(<DATABASE>) {
  chomp;                                # remove trailing \n from $_
  my($groep2, $groep_id2) = split '\|'; # same as: split('\|', $_)
  
  # Save record as an anonymous hash (hash reference)
  # inside @data
  push @records, {
    groep2    => $groep2,
    groep_id2 => $groep_id2
  };
}

close(DATABASE);

#
# Sort @data by groep2 (ascending alphabetically).
# Some notes:
#
#  1. $a and $b are aliases to two elements of @records.
#  2. The 'cmp' operator says we're doing string comparisons
#     (we would have used <=> for comparing numbers).
#  3. Placing the $a->{groep2} on the left side of the
#     comparison operator 'cmp' means that we want things
#     sorted ascending. If you'd like sorting done descending
#     alphabetically, then place $b on the left side and
#     $a on the right side of the comparison operator.
#

@data = sort { $a->{groep2} cmp $b->{groep2} } @records;

#
# Output each record in an HTML table
#

print <<'END_HTML';
<TABLE BORDER=1>
    <TR>
      <TH> groep2 </TH>
      <TH> groep_id2 </TH>
    </TR>
END_HTML

foreach my $record (@records) {
  print <<"  END_HTML";
    <TR>
      <TD> $record->{groep2} </TD>
      <TD> $record->{groep_id2} </TD>
    </TR>
  END_HTML
}

print "</TABLE>\n";

At 3/2/2003 9:48 AM, Eelco Alosery wrote:

> Hello,
> 
> I'm having truble sorting a database.
> I use this script to open and read a database:
> open (DATABASE, "$data_file") || die "Can't Open $data_file";
> while(<DATABASE>)
> {
> ($groep2, $groep_id2) = split(/\|/,$_);
> foreach ($groep2)
> {
> print <<ENDOFTEXT;
> $groep2<br>
> ENDOFTEXT
> }
> }
> close(DATABASE);
> 
> The problem I have is that I want $groep2 to be display't alfabetical.
> I have tested several options using the sort comand but I cant get it
> to work the way I want.
> 
> How do I do this sorting.
> Thanks
> 

Reply via email to