Sven: Textdatenbank sortieren nach mehreren Felder

Hallo zusammen

Ich habe eine Textdatenbank welche ich einlese und sortieren möchte.
Die Datenbank hat folgenden Inhalt (Beispiel):

Microsoft|Office 2000|7.0|Vollversion|
Microsoft|Office 95|6.0|Vollversion|
Microsoft|Windows NT|4.0|Vollversion|
Microsoft|Windows 2000|5.0|Vollversion|
Microsoft|Windows XP|5.1|Vollversion|
Adobe|Photoshop 7|7.0|Vollversion|
Adobe|Photoshop CS|8.0|Vollversion|

Die Datenbank lese ich so ein:

open (DAT , "< $data");  
@lines = <DAT>;  
close(DAT);  
  
@sortlines = sort @lines;  
  
foreach $line (@sortlines)  
	{  
	chomp ($line);  
	($vendor, $product, $version, $type) = split(/\|/, $line);  
	push @inhalt, "$vendor, $product, $version, $type\n";  
	}  
$addr_inhalt = join(/ / , @inhalt);

Ich möchte nun die Ausgabe sortieren. Das heisst, das zuerst nach Hersteller, Produktebezeichnung und dann nach Version gefiltert wird.

Nur habe ich nicht wirklich einen blassen Schimmer wie ich das anstellen soll. Ich habe mal etwas über Hash gelesen und könnte mir vorstellen, dass es damit geht. Nur wie bringe ich meine Array in den Hash und ist Hash das richtige Mittel? Wäre um Hilfe und ein kleines Code-Beispiel sehr dankbar.

Grüsse Sven

  1. Ich habe eine Textdatenbank welche ich einlese und sortieren möchte.

    Du suchst: http://perl-seiten.homepage.t-online.de/html/perl_schw.html

    musst dazu aber deine Daten anders einlesen. Dein Perlcode ist reichlich gruselig. Nutzt du nicht strict? Machst du keine Fehlerprüfungen?

    Struppi.

    1. Danke für Deine Antwort nur bin ich jetzt immer noch genau so schlau wie vorhin. Was ist den am Code nicht gut? Es muss lediglich seinen Zweck erfüllen mehr nicht.

      Sven.

      1. Hi,

        Danke für Deine Antwort nur bin ich jetzt immer noch genau so schlau wie vorhin.

        Dann solltest du dir die Quelle, dir die verlinkt wurde, vielleicht auch mal in Ruhe ansehen. Oder willst du behaupten, dass in nur fünf Minuten getan zu haben?

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Ich kannte die Seite schon. Habe schon unzählige Stunden rum gegoogelt. Mein Problem ist, dass ich nicht weiss wo ansetzen. Ob ich das ganze überhaupt in einen Array einlesen darf zum weiterverarbeiten. Ich stehe da schon an.

          Du siehst, ich habe mich schon mit unzähligen Erklärungen auseinander gesetzt und würde kaum fragen, wenn ich ein Profi wäre und ich mit den Anleitungen weiter gekommen wäre. Für Euch ist das sicher alles 0815. Für mich leider nicht.

          Sven.

          1. Ich kannte die Seite schon. Habe schon unzählige Stunden rum gegoogelt. Mein Problem ist, dass ich nicht weiss wo ansetzen. Ob ich das ganze überhaupt in einen Array einlesen darf zum weiterverarbeiten. Ich stehe da schon an.

            Du siehst, ich habe mich schon mit unzähligen Erklärungen auseinander gesetzt und würde kaum fragen, wenn ich ein Profi wäre und ich mit den Anleitungen weiter gekommen wäre. Für Euch ist das sicher alles 0815. Für mich leider nicht.

            Wenn deine Felder alle eine maximale Zeichenlänge haben, dann kannst du die Felder mit sprintf() zu einem Hashkey konvertieren, deren zugehöriger Wert ein [Array] der originalen Daten ist.

            Du kannst dann den hash über die hashkeys schnell sortieren.

            Alternative zu sprintf() wäre ein pack().

            mfg Beat

            --
            ><o(((°>           ><o(((°>
               <°)))o><                     ><o(((°>o
            Der Valigator leibt diese Fische
      2. Danke für Deine Antwort nur bin ich jetzt immer noch genau so schlau wie vorhin. Was ist den am Code nicht gut? Es muss lediglich seinen Zweck erfüllen mehr nicht.

        Hoi!
        Code, der seinen Zweck erfüllt (nämlich den Coder über seine eigene Irrtümer zu informieren) sollte aber
          use strict;
          use warnings;
        beinhalten.

        Und das wird dir dann zeigen, was an deinem Code nicht gut ist.

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
      3. Danke für Deine Antwort nur bin ich jetzt immer noch genau so schlau wie vorhin. Was ist den am Code nicht gut? Es muss lediglich seinen Zweck erfüllen mehr nicht.

        So sähe es in nach deinem Beispiel aus:

        #!/usr/bin/perl -w  
        use strict;  
          
          
          
        my @sortlines = map {$_}  
                    sort{ $a->[0] .$a->[1] .$a->[2] cmp $b->[0] . $b->[1] . $b->[2] }  
                    map {[split(/\|/, $_)] } <DATA>;  
          
        use Data::Dumper;  
        print Dumper \@sortlines;  
          
          
        __DATA__  
        Microsoft|Office 2000|7.0|Vollversion|  
        Microsoft|Office 95|6.0|Vollversion|  
        Microsoft|Windows NT|4.0|Vollversion|  
        Microsoft|Windows 2000|5.0|Vollversion|  
        Microsoft|Windows XP|5.1|Vollversion|  
        Adobe|Photoshop 7|7.0|Vollversion|  
        Adobe|Photoshop CS|8.0|Vollversion|
        

        Struppi.

        1. Hey toll, danke für Deine Antwort. Mit unzähligem pröbeln bin ich auf eine ähnliche Lösung gekommen wie Du. Ich habe es so gemacht:

          @sortiert = map { $_->[0] }  
          sort { $a->[1] cmp $b->[1] || $a->[2] cmp $n->[2] || $a->[3] <=> $b->[3] }  
          map { [$_,(split (/\| /,$_))[0,1,2]] } @lines ;
          

          Das funktioniert auch mehr oder weniger. Ich habe bloss das Problem dass wenn ich 1 und 2 stellige Zahlen haben das Sortieren nicht richtig klappt.

          Darf ich Dich noch etwas fragen. Für was benötigst Du das Modul (use Data::Dumper;)?

          Viele Grüsse

          Sven

          1. @sortiert = map { $_->[0] }

            sort { $a->[1] cmp $b->[1] || $a->[2] cmp $n->[2] || $a->[3] <=> $b->[3] }
            map { [$,(split (/| /,$))[0,1,2]] } @lines ;

            
            >   
            >   
            > Das funktioniert auch mehr oder weniger. Ich habe bloss das Problem dass wenn ich 1 und 2 stellige Zahlen haben das Sortieren nicht richtig klappt.  
              
            Wieso? Das klappt doch in deiner Version besser als in meiner.  
            ~~~perl
            #!/usr/bin/perl -w  
            use strict;  
              
            my @data = <DATA>;  
              
            my @sortiert = map { $_->[0] }  
            sort { $a->[1] cmp $b->[1] || $a->[2] cmp $b->[2] || $a->[3] <=> $b->[3] }  
            map { [$_,(split (/\|/,$_))[0,1,2]] } @data;  
              
            use Data::Dumper;  
            print Dumper \@sortiert;  
              
            __DATA__  
            Microsoft|Office 2000|7.0|Vollversion|  
            Microsoft|Office 95|6.0|Vollversion|  
            Microsoft|Windows NT|4.0|Vollversion|  
            Microsoft|Windows 2000|5.0|Vollversion|  
            Microsoft|Windows XP|5.1|Vollversion|  
            Adobe|Photoshop 7|7.0|Vollversion|  
            Adobe|Photoshop CS|8.0|Vollversion|  
            Adobe|Photoshop CS|10.1|Vollversion|  
            Adobe|Photoshop CS|8.2|Vollversion|  
            
            

            Darf ich Dich noch etwas fragen. Für was benötigst Du das Modul (use Data::Dumper;)?

            Für die Ausgabe des Arrays.

            Struppi.