in reply to Re: Question regarding DB_File
in thread Question regarding DB_File

I'm going to describe the catalog number system in detail:
There are several types of catalog numbers: When sorted a list of the following catalog numbers:
219, C18, 291a, C3a, 756-765, C21/22, 219a, 756, 291, C20, C30

Should look like this:

I can't have normal numbers out of order (as an alphabetical sort would do, with 10 coming before 9), nor can I change the catalog numbering system. How is someone supposed to be able to sort a list like that? It's totally beyond me! I'm really doubting it's possible. I would love for someone to prove me wrong!!!

Stamp_Guy

Replies are listed 'Best First'.
Re: Re: Re: Question regarding DB_File
by no_slogan (Deacon) on Jul 07, 2001 at 01:53 UTC
    It is possible to write a sort function that will produce any arbitrary order your heart desires. However, it might be difficult to write, and the resulting program might not be very efficient. A powerful technique is to transform the keys into something that can be sorted alphabetically. This is much easier to think about, and lets you take advantage of the special key-reduction optimizations that are built into the newer versions of DB_File.

    If you know that the catalog numbers never have more than a certain number of digits, you can make them sortable by adding leading zeroes to numbers, like this:

    • 9 -> 009
    • 123a -> 123a
    • C30 -> C030
    • C21/22 -> C021/022
    ...and so on. You can make this transformation with a simple statement like:
    $key =~ s/(\d+)/sprintf "%03d", $1/eg;
    Remember to keep a copy of the original key around so you can show it to your users, and they won't ever have to know what you've done.

    If you don't have a guarantee about how many digits can be in a catalog number, there are clever solutions... You could, for instance, store the number of digits followed by the actual digits themselves.

      Thanks! This worked PERFECTLY!