Schwartzsche Transformation - Problem mit CSV
Jonas
- perl
0 Siechfred0 Jonas
0 Siechfred0 Margin-Auto0 Jonas
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
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
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
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
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
F***!
Klar, dann hab ich ja alles umgedreht. Mein Gott, dass ich da nicht selbst drauf gekommen bin!
DANKE!
Gruss
Jonas