Datums-Routinen, ich packs nicht :(
Bruno
- perl
Hallo Forum und Perl-Programmierer,
ich beisse mir schon zwei Tage die Zähne an einer Datumsroutine aus und komme einfach nicht weiter.
Könntet Ihr mir vielleicht mal einen kleinen Schubs geben, wie man das Problem am besten löst?
Bitte nicht falsch verstehen, ich suche keinen fertigen Code, sondern nur einen Denkansatz :)
Gegeben sei mal eine Variable mit dem Inhalt des aktuellen Monats, z.B. so: $akt_monat = "4" ....also April.
Jetzt wird eine Excel-Tabelle ausgelesen mit folgendem Inhalt der ersten Spalte:
30.
31.
1.
2.
3.
...das ganze bis 30
30.
1.
Zu erkennen, dass der 30. & 31. noch zum März gehören und ganz unten schon der Mai mit dem 1. anfängt.
Die Perl-Routine soll nun automatisch erkennen, um welchen Monat es sich handelt und dies in eine neue $Variable[$zaehler] schreiben.
So soll es aussehen:
30.03.
31.03.
01.04.
02.04.
03.04.
...das ganze bis 30
30.04.
01.05.
Bei meinen Versuchen kommen wirklich interessante Resultate raus, nur nicht das gewünschte :)
Kann mir jemand helfen?
Viele Grüße,
Bruno
use Date::Calc qw( :all );
Schau danach unter www.cpan.org.
Ciao Micha
use Mosche;
Gegeben sei mal eine Variable mit dem Inhalt des aktuellen Monats, z.B. so: $akt_monat = "4" ....also April.
Jetzt wird eine Excel-Tabelle ausgelesen mit folgendem Inhalt der ersten Spalte:
...das ganze bis 30
30.
1.
Zu erkennen, dass der 30. & 31. noch zum März gehören und ganz unten schon der Mai mit dem 1. anfängt.
Die Perl-Routine soll nun automatisch erkennen, um welchen Monat es sich handelt und dies in eine neue $Variable[$zaehler] schreiben.
Ich denke mal, $akt_monat ist der Startmonat. Das heisst, alle Daten von Beginn an gehören zu $akt_monat. Du liest danach Zeile für Zeile und vergleichst die aktuelle Zeile mit der letzten (den Punkt bekommst du mit substr weg). Wenn der aktuelle Tag kleiner ist als der vorherige, beginnt ein neuer Monat ($akt_monat erhöhen).
use Tschoe qw(Matti);
Viele Grüße,
Bruno
Hallo Matti,
Ich denke mal, $akt_monat ist der Startmonat. Das heisst, alle Daten von Beginn an gehören zu $akt_monat. Du liest danach Zeile für Zeile und vergleichst die aktuelle Zeile mit der letzten (den Punkt bekommst du mit substr weg). Wenn der aktuelle Tag kleiner ist als der vorherige, beginnt ein neuer Monat ($akt_monat erhöhen).
im Prinzip richtig, aber :)
Wenn zu dem 1.Mai dann vielleicht auch ein 2.Mai und 3.Mai kommen würde, dann geht dieser Vergleich nicht mehr :(
Das ist mein Problem.
Viele Grüße,
Bruno
use Mosche;
Ich denke mal, $akt_monat ist der Startmonat. Das heisst, alle Daten von Beginn an gehören zu $akt_monat. Du liest danach Zeile für Zeile und vergleichst die aktuelle Zeile mit der letzten (den Punkt bekommst du mit substr weg). Wenn der aktuelle Tag kleiner ist als der vorherige, beginnt ein neuer Monat ($akt_monat erhöhen).
im Prinzip richtig, aber :)
Wenn zu dem 1.Mai dann vielleicht auch ein 2.Mai und 3.Mai kommen würde, dann geht dieser Vergleich nicht mehr :(
Wie sehen die Daten, die du bekommst, denn genau aus.
Ich dachte, etwa so: (die Punkte laß ich der Einfachkeit halber weg)
my @dates = ((1..30), (1..31), (1..30));
my $akt_monat = 4;
my @dates_formatted;
my $pre = shift @dates; # Startwert für $pre
foreach (@dates) {
push (@dates_formatted, "$pre.$akt_monat.");
# die aktuelle Tagzahl ist kleiner als die letzte: neuer Monat
++$akt_monat if $_ < $pre;
$pre = $_;
}
$\ = "\n";
print for @dates_formatted;
Und das funktioniert. (getestet)
Wenn deine Daten andere sein sollten, erläutere das bitte nochmal.
use Tschoe qw(Matti);
Hallo Matti,
Wenn deine Daten andere sein sollten, erläutere das bitte nochmal.
vielen Dank für Deine Hilfsbereitschaft!
Die Daten aus der Excel-Tabelle werden in der Tat in einem Array gespeichert.
Die Spalte der Excel-Tabelle, die ausgelesen wird, enthält die Informationen, die ich am Anfang schon mal aufgeschrieben habe.
Also genau EIN Array mit allen Daten.
Für April siehts genau so aus (04.04.2002 bis 01.05.2002):
4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.1.
(man beachte also am Schluss die "1" -> schon Mai
für März sah der Inhalt so aus (28.02.2002 bis 03.04.2002):
28.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.1.2.3.
(also am Anfang der 28.Februar und am Ende der 1., 2. & 3. April)
Ich hoffe, ich habe es einigermassen erklärt :)
Viele Grüße,
Bruno
Hallo Matti,
habs gelöst :))
2 Zeilen if-Abfragen - nicht schön, aber geht.
Vielen Dank nochmal!!!
Bruno