Alexander R.: Anzahl der Zeilen in einem Text-File

Hallo!

Ich benötige mal wieder Eure Hilfe. Auf der Seite http://www.horror-shop.de/ ist das Problemchen zu sehen, wenn man in der Auswahl "Deadly Faces" wählt (Bei allen anderen Kategorien geht es).

Mit folgendem Script soll die Anzahl der Zeilen in einem Text File ausgelesen werden (denk ich zumindest mal):

open (INFILE, $file);
while (<INFILE>)
{  
$linecount = $linecount + 1
}
close (INFILE);

Das scheint auch zu klappen. Nur eben bei "Deadly Faces" nicht. Das muss also an dem Text File liegen. Es sieht aber genauso wie die anderen auch aus (zumindest auf den ersten Blick). Ich benutze übrigens für die Text Files des Windows Editor. Ist das vielleicht ein Problem?

TIA, Alex

  1. Hi,

    open (INFILE, $file);
    while (<INFILE>)

    »»  {  
    »»  $linecount = $linecount + 1
    »»  }

    close (INFILE);

    open(INFILE, $file) or die "Kann $file nicht oeffnen: $!";
    $linecount++ while (<INFILE>);
    close(INFILE);

    Das scheint auch zu klappen. Nur eben bei "Deadly Faces" nicht. Das muss also an dem Text File liegen. Es sieht aber genauso wie die anderen auch aus (zumindest auf den ersten Blick).

    Schwer zu sagen, wenn man nicht mal einen ersten Blick drauf werfen kann. Falls Du nach obigem Code also keine Fehlermeldung in Deinem Error-Log findest, gib uns doch bitte mal die URLs von zwei der Dateien.

    Cheatah

    1. Schwer zu sagen, wenn man nicht mal einen ersten Blick drauf werfen kann. Falls Du nach obigem Code also keine Fehlermeldung in Deinem Error-Log findest, gib uns doch bitte mal die URLs von zwei der Dateien.

      Daran scheint es nicht zu liegen.
      Was bedeutet denn dieser Ausdruck? Für was steht ".+"?

      if ($seiten =~ /.+/)

      Alex

      1. Schwer zu sagen, wenn man nicht mal einen ersten Blick drauf werfen kann. Falls Du nach obigem Code also keine Fehlermeldung in Deinem Error-Log findest, gib uns doch bitte mal die URLs von zwei der Dateien.

        Daran scheint es nicht zu liegen.
        Was bedeutet denn dieser Ausdruck? Für was steht ".+"?

        if ($seiten =~ /.+/)

        Alex

        Ist zu unklar. Kann sein, daß der Inhalt der Variable $seiten auf Punkte überprüft wird oder ob überhaupt Zeichen in ihr vorkommen.
        Probiere am besten meinen 1. Tip!

      2. Hi,

        Was bedeutet denn dieser Ausdruck? Für was steht ".+"?

        if ($seiten =~ /.+/)

        "wenn $seiten mindestens ein Zeichen (bis auf Newlines) enthält, dann..."

        Mehr dazu findest Du in

        perldoc perlre

        Cheatah

    2. Hi,

      open (INFILE, $file);
      while (<INFILE>)
      »»  {  
      »»  $linecount = $linecount + 1
      »»  }
      close (INFILE);

      open(INFILE, $file) or die "Kann $file nicht oeffnen: $!";
      $linecount++ while (<INFILE>);
      close(INFILE);

      Das scheint auch zu klappen. Nur eben bei "Deadly Faces" nicht. Das muss also an dem Text File liegen. Es sieht aber genauso wie die anderen auch aus (zumindest auf den ersten Blick).

      Schwer zu sagen, wenn man nicht mal einen ersten Blick drauf werfen kann. Falls Du nach obigem Code also keine Fehlermeldung in Deinem Error-Log findest, gib uns doch bitte mal die URLs von zwei der Dateien.

      Cheatah

      Versuche es mal so:

      open(INFILE, $file) or die "Kann $file nicht oeffnen: $!";
      @INFILEDATA=<INFILE>;
      close(INFILE);
      foreach $data (@INFILEDATA){
         $linecount++;
      }

      Sollte auf jeden Fall funktionieren. Wenn nicht, dann prüfe mal, ob die Variable $linecount schon mal verwendet wurde! oder schreibe einfach noch vor der foreach-Schleife:

      $linecount=0;

      Alles klar!

      Dann tschau!

      1. Hi,

        open(INFILE, $file) or die "Kann $file nicht oeffnen: $!";
        @INFILEDATA=<INFILE>;
        close(INFILE);

        naja, es gibt eigentlich keinen Grund, die gesamte Datei in den Speicher zu laden, aber...

        foreach $data (@INFILEDATA){
           $linecount++;
        }

        ...dies wäre doch besser mit

        my $linecount = scalar @INFILEDATA;

        gemacht :-) Nebenbei bemerkt sind GROSSBUCHSTABEN ein Zeichen für Filehandler oder Systemvariablen. Deine Nomenklatur verwirrt...

        Cheatah

    3. Kurzer Nachtrag:

      Es liegt definitiv an dieser Abfrage:

      $zahl ist die maximale Anzahl der Seiten.
      $seiten ist vor dieser Abfrage noch "5".

      if ($seiten =~ /.+/)
        {
         $len = length($seiten);
         $zahl = substr($seiten,0,
      $len - 2);
         $zahl = $zahl + 1;
        }
      else
      {$zahl = $seiten}

      Alex

      1. Kurzer Nachtrag:

        Es liegt definitiv an dieser Abfrage:

        $zahl ist die maximale Anzahl der Seiten.
        $seiten ist vor dieser Abfrage noch "5".

        if ($seiten =~ /.+/)
          {
           $len = length($seiten);
           $zahl = substr($seiten,0,
        $len - 2);
           $zahl = $zahl + 1;
          }
        else

        »»  {$zahl = $seiten}

        Alex

        Auf was soll den die Variable $seiten geprüft werden? Eigenartige Definition!

        André

        1. Auf was soll den die Variable $seiten geprüft werden? Eigenartige Definition!

          André

          Also zuerst mal Danke für Deine Hilfe.
          Dein ersten Vorschlag habe ich eingefügt, daran liegt es aber nicht.

          Also der komplette Code der wohl Anfang und Ende festlegen soll sieht so aus:

          $ende = $bis * 10;
          $start= $ende - 9;
          if ($ende >= $linecount) { $lastpage=1 };
          $weiter = $bis + 1;
          $pre = $bis - 1;

          $seiten = $linecount / 10;
          print $seiten;
          if ($seiten =~ /.+/)
            {
             $len = length($seiten);
             $zahl = substr($seiten, 0, $len - 2);
             $zahl = $zahl + 1;
            }
          else
          {$zahl = $seiten}

          $dummy = $seiten / 10;

          if ($dummy =~ /.+/)

          {
             $len = length($seiten);
             $zahl = substr($seiten, 0, $len - 2);
             $zahl = $zahl + 1;
            }
          else
          {$zahl = $seiten}

          Krass, oder? Ich als Anfänger check recht wenig.

          Alex

          1. Check mal bitte Dein E-Mailpostfach auf neue Mails!

            Melde mich!

            André

          2. Auf was soll den die Variable $seiten geprüft werden? Eigenartige Definition!

            André

            Also zuerst mal Danke für Deine Hilfe.
            Dein ersten Vorschlag habe ich eingefügt, daran liegt es aber nicht.

            Also der komplette Code der wohl Anfang und Ende festlegen soll sieht so aus:

            $ende = $bis * 10;
            $start= $ende - 9;
            if ($ende >= $linecount) { $lastpage=1 };
            $weiter = $bis + 1;
            $pre = $bis - 1;

            $seiten = $linecount / 10;
            print $seiten;
            if ($seiten =~ /.+/)
              {
               $len = length($seiten);
               $zahl = substr($seiten, 0, $len - 2);
               $zahl = $zahl + 1;
              }
            else

            »»  {$zahl = $seiten}

            $dummy = $seiten / 10;

            if ($dummy =~ /.+/)

            {
               $len = length($seiten);
               $zahl = substr($seiten, 0, $len - 2);
               $zahl = $zahl + 1;
              }
            else

            »»  {$zahl = $seiten}

            Krass, oder? Ich als Anfänger check recht wenig.

            Alex

            Vielleicht liegt das Problem daran, das Du die Länge der Variable $seiten mit Hilfe von $len = length($seiten); ermittelst statt die Zeilen der Datei zu zählen.
            Benutze unbedingt meinen 1. TIP!!! Datei öffnen und dann die foreach-Schleife und anschließend:

            print $linecount;

            Was wird denn als Fehler angezeigtm, welche Zahl und wieviel Zeilen hat die Datei eigentlich, deren Zeilen Du zählen willst?

            André

          3. Hi,

            $seiten = $linecount / 10;

            ah, ich ahne. Es geht hier vermutlich um Nachkommastellen.

            if ($seiten =~ /.+/)

            Hier prüfst Du, ob $seiten mindestens ein _Zeichen_ enthält - nicht einen Punkt!

            my $zahl = ($seiten == int($seiten)) ? $seiten : int($seiten)+1;

            Läßt sich sicher noch etwas optimieren.

            $dummy = $seiten / 10;

            Hm? Jetzt den ganzen Klumpatsch noch mal?

            Krass, oder? Ich als Anfänger check recht wenig.

            Mit diesem Problem stehst Du nicht alleine da... :-)

            Cheatah