Datum aus externer Datei lesen und prüfen
Peter Hübner
- perl
Hallo!
Seit Tagen beschäftige ich mich mit einem Perl-Script, was ähnlich wie ein Eventkalender funktionieren soll. In einer externen Datei habe ich Daten mit folgendem Syntax gespeichert:
vid;stag;smonat;sjahr;etag;emonat;ejahr;zeit;ortid;vaid;rid;ver;vinfo
101;10;06;2002;12;06;2002;14:00;hier;102;3;das;news
Also die einzelnen Daten wurden ähnlich wie in einer Datenbank eingegeben und durch Semikola getrennt. Datei sind die Variablen stag, smonat, sjahr das Startdatum und etag, emonat, ejahr das Enddatum. Jetzt habe ich ein Script geschrieben, was diese Daten ausliest. Über ein Eingabeformular soll ein Zeitraum dem Script gegeben werden, welcher dann alle in diesem Zeitraum vorhanden Eintragungen in einer Liste anzeigt.
Hier ein Auszug aus dem Script:
open(IN,'daten.csv') or die 'Kann Daten öffnen: '.$!;
flock(IN,2);
while($ez = <IN>)
my($vid,$stag,$smonat,$sjahr,$etag,$emonat,$ejahr,$zeit,$ortid,$vaid,$rid,$ver,$vinfo) = split(/;/,$ez);
if($stag le $fstag && $smonat le $fsmonat && $sjahr le $fsjahr &&
$etag ge $eftag && $emonat ge $femonat && $ejahr ge $fejahr){
... generierte Liste ...
}else{ $error="true" }
}
Die Variablen mit "f" (also z.B. $fstag) sind jeweils die vom Formular übergeben Daten.
Leider werden bei dieser if-Abfrage ständig auch andere Daten anzeigt, oder auch gänzlich keine. Hat jemand zufällig eine andere Idee, wie die Selektierung der einzelnen anzuzeigenden Datensätze besser gelöst werden kann?
Vorab schoneinmal vielen Dank für Eure Hilfe!
Ciao
Peter
Hoi
Ich habe das Gleiche auch gemacht, jedoch auf eine andere Art. Ich kann Dir keinen Tipp für Dein Script geben. Falls Du aber an einem anderen Lösungsansatz interesse hast lies weiter....
Mein Lösungsansatz war:
Ich lege die Records anders ab. Ich verwende in umgekehrter Reihenfolge das Datum und Zeit als RecordID/Key. Dazu füge ich noch drei Stellen als fortlaufender Zähler. So können 1000 Enträge für ein Datum sein (reichte für mich aus).
z.B. Heute:
200206111354000;...
Diese Art der Speicherung ermöglichte mir einen sehr einfachen Zahlenvergleich grösser/kleiner um einen Datumsbereich zu finden. Einzige zusätzliche Arbeit die ich habe, aber wirklich einfach ist - ich muss den Zahlenwurm wieder in ein lesbares Datum zurückwandeln.
cheers
kaepten
PS: Willst Du mir das Script abkaufen ;-) zu sehen ist es auf www.vsp-asfc.ch "kalender"
Hi!
Danke ersteinmal für Deine schnelle Hilfe.
Ich habe die Daten als solches so belassen, jedoch im Script selbst den Syntax 200206111354000 erstellen lassen. Also die eingegeben Formulardaten sowie die Daten der externen Datei so wie in Deinem Vorschlag formatiert. Das Skript läuft einwandfrei. Da die eingegebenen Termine sich teilweise auch über mehrere Tage hinstrecken, habe ich nach dem gleichen Schlüssel auch das Enddatum automatisch formatieren lassen.
Läuft super!
Ciao
Peter
Moin Moin !
le, ge, eq sind String-Vergleiche!
Du willst <= >= == benutzen.
Alexander
Hier ein Auszug aus dem Script:
open(IN,'daten.csv') or die 'Kann Daten öffnen: '.$!;
flock(IN,2);
while($ez = <IN>)
my($vid,$stag,$smonat,$sjahr,$etag,$emonat,$ejahr,$zeit,$ortid,$vaid,$rid,$ver,$vinfo) = split(/;/,$ez);
if($stag le $fstag && $smonat le $fsmonat && $sjahr le $fsjahr &&
$etag ge $eftag && $emonat ge $femonat && $ejahr ge $fejahr){
... generierte Liste ...
}else{ $error="true" }
}