Jutta Rosenbach: CGI - Hilfe bei einem fast ganzen Skript erbeten

Hallo CGI-Fachleute,

Das Skript soll:

  • eine Datenbank (termine.csv) auslesen,
  • die Datensaetze nach Datum und Uhrzeit sortieren
  • und in eine neue Datei schreiben.

Ich hatte zum Sortieren in der termine.csv Datum und Zeit zerlegt in
Jahr;Monat;Tag;Stunde;Minute;
----------------------------------------------------
open(TERMINEDAT, ">../../kalender/termine.js");
  print TERMINEDAT "var arraycount=0\n";

for(@SortierteListe)
   {
    @Datensatz = split(/;/,$_);
    $i = 0;
    for(@Datensatz)
     {
      if ($i == 0)    {$Jahr   = $Datensatz[$i];}
      elsif ($i == 1) {$Monat  = $Datensatz[$i];}
      elsif ($i == 2) {$Tag    = $Datensatz[$i];}
      elsif ($i == 3) {$Stunde = $Datensatz[$i];}
      elsif ($i == 4) {$Minute = $Datensatz[$i];}
      elsif ($i == 10)
        {
print TERMINEDAT "arraycount += 1\n";
print TERMINEDAT "terminArray[arraycount] =
"$Tag.$Monat.$Jahr"\n";

print TERMINEDAT "zeitArray\[arraycount\] \=  

"$Stunde:$Minute"\n";
        }
       else
         {
           print TERMINEDAT "$Datenfelder[$i] = $Datensatz[$i]\n";
         }
----------------------------------------------------
Das funzte nicht und ich erfuhr, dass das Skript die Datensaetze nur
nach dem ersten Feld, dem Jahr sortiere und dann aufhoert.

Ich koenne den String aber in der Sortierfunktion zerteilen, und
dann die Einzelwerte untersuchen.
------<snipp>-------------<snipp>-------------<snipp>-------------<s
nipp>--
sub NummernSort
  {
    @DatensatzA = split(/;/,$a);
    @DatensatzB = split(/;/,$b);
    $i = 0;
    $Result = 0;
    while (($i < 6) && ($Result == 0))
    {
        $Result = ($DatensatzA[$i] == $DatensatzB[$i]) if
($DatensatzA[$i] <> $DatensatzB[$i]);
        $i++;
    }
  }
------<snipp>-------------<snipp>-------------<snipp>-------------<s
nipp>--

Leider bin ich diesbezueglich eine Patchworktante - d.h. ICH WEISS
LEIDER NICHT, WAS ICH TUE.
Brauche ich dieses Unterprogramm nun nur irgendwo in mein Skript
dazwischensetzen? Wo?
Ist es schon fertig? Wie rufe ich es auf?
Kurz und klein: wie muss das Skript richtig aussehen, dass es funzt?

ist das ueberhaupt eine Loesung - oder muss alles ganz anders
gemacht werden? Die Felder in der termine.csv kann ich gerne passend
machen: zusammenziehen, andere Reihenfolge o.ae.
Ich will halt zum Schluss einen Veranstaltungskalender haben.

Fuer Deine Hilfe bin ich sehr dankbar.
Viele Gruesse
Jutta
j@rosenbach.com

  1. Hallo CGI-Fachleute,

    Das Skript soll:

    • eine Datenbank (termine.csv) auslesen,
    • die Datensaetze nach Datum und Uhrzeit sortieren
    • und in eine neue Datei schreiben.

    Patchworkonkel an Patchworktante.

    Hallo Jutta.
    also das Script habe ich nicht kapiert. Aber wenn ich die Aufgabe kapiert habe, dann kann ich Dir helfen.

    Aus der Datei termine.csv:

    1994;02;05;12;23;Termin Nr. 1 vom 2.5.94 usw.
    1997;12;15;06;10;Termin Nr. 2 vom 15.12.97 usw.
    1991;05;28;20;23;Termin Nr. 3 vom 28.5.91 usw.

    Macht dieses Script:

    -----------------------------------------------------------------

    #!/usr/local/bin/perl5

    Juttas Terminkalender

    by Wolfgang Bund ( wolfgang.bund@usa.net )

    $Termine    = "termine.csv";           # Termine
    $Sortiert   = "sortiert.csv";          # Sortierte Termine

    Termine einlesen und in einzelne Zeilen zerlegen

    @Zeilen = ("");
    open(TERMINE, "<$Termine") || die "Datei "+$Termine+" konnte nicht geöffnet werden\n";
      while(<TERMINE>)
       {
         push(@Zeilen, $_);
       }

    close(TERMINE);

    Zeilen sortieren

    @Zeilen = sort(@Zeilen);

    Neue Datei anlegen

    open(SORTIERT, ">$Sortiert") || die "Datei "+$Sortiert+" konnte nicht angelegt werden\n";

    Jede Zeile ausgeben

    for(@Zeilen)
      {
         print SORTIERT $_;
      }

    close(SORTIERT);

    -----------------------------------------

    Das da:

    1991;05;28;20;23;Termin Nr. 3 vom 28.5.91 usw.
    1994;02;05;12;23;Termin Nr. 1 vom 2.5.94 usw.
    1997;12;15;06;10;Termin Nr. 2 vom 15.12.97 usw.

    Ist vielleicht ein wenig umständlich, aber funktioniert.

    Gruß,
    Wolfgang

  2. Hallo Jutta!

    Jetzt ist mein Skript gerade fertig, daher poste ich es auch noch

    • sonst haette ich ja umsonst herumprobiert ;-)
      Immerhin gibt's bei mir auch gleich die angedeutete JavaScript-Ausgabe mit...

    #!/usr/bin/perl

    Datei 'termine.csv' zeilenweise einlesen...

    open(EIN, "<termine.csv") || die "Kann termine.csv nicht finden!\n";
    while(<EIN>)
    {
      push(@zeilen, $_);
    }
    close(EIN);

    Die Zeilen sortieren

    (Achtung: Die Anzahl der Stellen sollte bei

    #  allen Eintraegen gleich sein,
    #  also z.B. immer  JJJJ;MM;TT;SS;MM; )

    @sortZeilen = sort(@zeilen);

    Inhalte der Zeilen ausgeben

    open(TERMINEDAT, ">termine.js");
    $i=0;
    for(@sortZeilen) {
      ($jahr, $monat, $tag, $stunde, $minute) = split(/;/, $_);

    print TERMINEDAT "terminArray[$i] = "$tag.$monat.$jahr";\n";
      print TERMINEDAT "zeitArray[$i]   = "$stunde:$minute";\n";
      $i++;
    }
    close(TERMINEDAT);

    ... aus der Datei ...

    1998;07;12;24;23;
    1995;03;16;24;23;
    1993;05;14;26;23;
    1993;05;14;24;23;

    ... produziert dieses Skript bei mir die Ausgabe (perl 5.003_07)

    terminArray[0] = "14.05.1993";
    zeitArray[0]   = "24:23";
    terminArray[1] = "14.05.1993";
    zeitArray[1]   = "26:23";
    terminArray[2] = "16.03.1995";
    zeitArray[2]   = "24:23";
    terminArray[3] = "12.07.1998";
    zeitArray[3]   = "24:23";

    Das Skript ist wahrscheinlich noch stark absturzgefaehrdet,
    wenn das Format von 'termine.csv' nicht stimmt.
    Insbesondere sollten keine ueberfluessigen Leerzeilen darin
    vorkommen...
    Die Sortierroutine funktioniert ausserdem nicht, wenn
    z.B. die Stundenzahl irgendwo nur einstellig angegeben wird
    (da dann z.B. 12 Uhr vor 9 Uhr gesetzt wird...)

    Vielleicht faellt jemandem im Forum, der mehr PERL-Erfahrung hat,
    ausser der Fehlerabfangroutinen
    ja noch eine bessere Sortier-Routine ein, die wirklich die
    einzelnen Zahlenwerte miteinander vergleicht?

    Viele Gruesse!

    Andreas