Jonas: Schwartzsche Transformation - Problem mit CSV

Hallo

Also, ich habe folgendes Problem in Zusammenhang mit der Schwartzsche Transformation.

Ich habe eine Liste (ein Array) der Form.
ID|Name|Zone|Datum|Genre|eingetragenVon

Das Datum ist in der Form TT.MM.JJJJ.

Nun will ich die Liste nach Datum sortieren. Ich habe dazu folgenden Ansatz versucht:
@array = map { $_->[0] }
          sort { reverse($a->[1] =~ s/.//g) <=> reverse($b->[1]=~ s/.//g) }
          map  { [ $_, (split /|/)[3] ] } @array;

Die Überlegung ist die folgende:
Ich entferne die Punkte aus dem Datum (TTMMJJJJ) und kehre das Ganze um (JJJJMMTT). Dann kann ich die Liste einfach nach dem Zahlenwert sortieren mit <=>.

Zu meine Bedauern ist dann aber zB. der 20.05.2005 nach  dem 29.12.2004 und dazwischen 27.12.2004 in der sortierten Liste.

Kann mir da jemand weiterhelfen?

Danke im voraus

Grüsse

Jonas

  1. Tag Jonas.

    Ich habe eine Liste (ein Array) der Form.
    ID|Name|Zone|Datum|Genre|eingetragenVon
    Das Datum ist in der Form TT.MM.JJJJ.
    Nun will ich die Liste nach Datum sortieren.

    Ein möglicher Ansatz wäre, das Datum mit Hilfe der Funktion Date_to_Time() aus dem Modul Date::Calc in Epochensekunden umzuwandeln und diese dann zu sortieren:

    use Date::Calc qw/Date_to_Time/;  
      
    @sorted_array = map { $_->[0] }  
                    sort { $a->[1] <=> $b->[1] }  
                    map  { [ $_, (Date_to_Time((split(/\./, split(/\|/)[3])[2,1,0]),0,0,0) ] } @array;
    

    Ohne Gewähr, das Testen überlasse ich dir :-)

    Siechfred

    --
    «Ich liebe euch doch alle!»
    1. Hi

      Dank dir, werde das mal so versuchen.

      Wieso es aber mit meiner Idee über "Punkte entfernen und dann rückwärts ansehen" nicht klappte, würde mich doch noch wunder nehmen...

      Gruss und Dank

      Jonas

  2. Tag Jonas.

    Kleine Ergänzung, die es evtl. etwas übersichtlicher macht (ich habe die Zeitumwandlung einfach in eine eigene Subroutine ausgelagert):

    #!/usr/bin/perl -w  
    use strict;  
    use warnings;  
    use CGI::Carp qw(fatalsToBrowser);  
    use Date::Calc qw/Date_to_Time/;  
    use Data::Dumper;  
      
    my @Daten = ("eins;10.01.2001", "zwei;05.05.1977", "drei;01.06.2004", "vier;07.07.2002", "fuenf;08.08.1988");  
      
    my @sortiert = map  { $_->[0] }  
                   sort { $a->[1] <=> $b->[1] }  
                   map  { [ $_, epsec((split /;/)[1]) ] } @Daten;  
      
    print "Content-type: text/html\n\n";  
    print "<p>Ausgangsdaten: ";  
    print Dumper \@Daten;  
    print "</p>";  
    print "<p>Schwartzsche Transformation:</p>";  
    print Dumper \@sortiert;  
      
    sub epsec {  
      my $date = shift;  
      my @dates = split(/\./, $date);  
      my $secs = Date_to_Time($dates[2], $dates[1], $dates[0], 0, 0, 0);  
      return $secs;  
    }
    

    Das Ergebnis kannst du dir hier ansehen: http://www.anaboe.net/cgi-bin/test.pl

    Siechfred

    --
    «Ich liebe euch doch alle!»
  3. Hi,

    Ich entferne die Punkte aus dem Datum (TTMMJJJJ) und kehre das Ganze um (JJJJMMTT). Dann kann ich die Liste einfach nach dem Zahlenwert sortieren mit <=>.

    Zu meine Bedauern ist dann aber zB. der 20.05.2005 nach  dem 29.12.2004 und dazwischen 27.12.2004 in der sortierten Liste.

    Funktioniert nicht, da du die Zahlen selbst auch rumdrehst: 20.05.2005 => 50025002, sinnvoll zum sortieren wäre 20050520.

    Helfen würde vielleicht sowas wie

      
    sort { reverse($a->[1] =~ split/\./) <=> reverse($b->[1]=~ split/\./) }  
    
    

    Also nach Punkten splitten und dieses Array dann rumdrehen.

    HTH

    Margin-Auto

    1. F***!

      Klar, dann hab ich ja alles umgedreht. Mein Gott, dass ich da nicht selbst drauf gekommen bin!

      DANKE!

      Gruss

      Jonas