bobby: falsche ausgabe bei forschleife

Hi
Ich habe mit dem folgendem Code ein Problem!!
Was der Code ausgeben soll:
  Er soll ein csv-File beschreiben (öffnen mit MS excel) und die Kalenderwochen aufrufen, untereinander schreiben. Da bei manchen IP's keine Eintäge vorhanden sind, habe ich eine for-schleife eingetragen.

Was im cvsFile steht ist nicht erwartet, es wird, wenn mehrere Einträge vorhanden sind, der nächste Eintrag verschoben.

Kann mir jemand helfen??

#write csv-file######
open (PRINT , ">$csv_print") || die "$!";
#print head
print PRINT "GOOGLE-STATISTIK\n\n";
print PRINT "$file_list\n";
print PRINT "Total;IP-Address;USER";
for ($kwweekcnt=1; $kwweekcnt<=$kwyear; ++$kwweekcnt){
    print PRINT ";KW: $kwweekcnt";
}
print PRINT "\n";
#print data
foreach $count_list (keys %ip_count) {
    print PRINT "\n$ip_count{$count_list}{total};$count_list;";
    print PRINT "$ip_names{$count_list};";
    %weekcnt = %{$ip_count{$count_list}{week}};
#Print KW-counts
   #forschleife, zum untereinanderschreiben der Kalenderwochen
   for($kwweekcnt=1; $kwweekcnt<=$kwyear; ++$kwweekcnt) {
        foreach $week (keys %weekcnt) {
            if($week == $kwweekcnt) {
                print PRINT "$weekcnt{$week}";
            }
            print PRINT ";";   #Um leere Spalten zu erzeugen
        }
    }
}

  1. Hallo,

    ich weiß jetzt nicht so genau, was Du willst?
    Bitte beschreib Dein Problem genauer.
    Der Code sollte aber nicht funktionieren, da Du innerhalb von doppelten
    Anführungszeichen die semikolon maskieren mußt.

    Bsp:

    print PRINT ";";
      wird zu
    print PRINT ";";

    oder Du nimmst einfache Anführungszeichen, dann werden aber die Variablen dazwischen nicht mehr interpretiert.
    print PRINT ';';

    ciao Andreas

    1. print PRINT ";";
        wird zu
      print PRINT ";";

      Die Maskierung funktioniert auch nicht, die Ausgabe ist genau gleich!

      print PRINT ';';

      Ergebniss liefert ebenfalls nicht das gewünschte ergebniss

      Ausgabe im csv file sollte sein:

      IP    | USER | KW 14    | KW 15    | KW 16    | ...
      a.a.a.a | aaaa | kw14: 4  | kw15: 3  | kw16: 9  | ...
      b.b.b.b | bbbb |          | kw15: 5  |          | ...

      Und so ist sie:

      IP    | USER | KW 14    | KW 15    | KW 16    | ...
      a.a.a.a | aaaa | kw23: 5  |          | kw29: 3  | ...
      b.b.b.b | bbbb |          | kw11: 21 |          | ...

      Ich hoffe dir ist mein Problem verständlicher!

      1. Ausgabe im csv file sollte sein:

        IP    | USER | KW 14    | KW 15    | KW 16    | ...
        a.a.a.a | aaaa | kw14: 4  | kw15: 3  | kw16: 9  | ...
        b.b.b.b | bbbb |          | kw15: 5  |          | ...

        Und so ist sie:

        IP    | USER | KW 14    | KW 15    | KW 16    | ...
        a.a.a.a | aaaa | kw23: 5  |          | kw29: 3  | ...
        b.b.b.b | bbbb |          | kw11: 21 |          | ...

        Ich hoffe dir ist mein Problem verständlicher!

        ja, aber notwendiger für die Beantwortuing deiner Frage, wäre ein Beispiel, wie die Input Daten aussehen.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. ja, aber notwendiger für die Beantwortuing deiner Frage, wäre ein Beispiel, wie die Input Daten aussehen.

          %ip_count = (
             "IP1"  => (
                   total => "34",
                   weeks => (
                        kw23  => "12,
                        kw25  => "3",
                          ...      #sind nicht immer aufeinanderfolgende zahlen
                    )
              ),
              "IP2" ....usw.
          );

          bobby

    2. Hi,

      Der Code sollte aber nicht funktionieren, da Du innerhalb von doppelten
      Anführungszeichen die semikolon maskieren mußt.

      Seit wann denn das? Also sollte das wirklich so sein, sind alle Dokumentationen falsch, denn ich hab in keiner eine Bestätigung deiner Aussage gefunden.

      1. Der Code sollte aber nicht funktionieren, da Du innerhalb von doppelten Anführungszeichen die semikolon maskieren mußt.

        ??!!??!!, Es hat keinen Unterschied gemacht, ob das semikolon maskiert war oder nicht und der interpreter hat vorher auch nicht gemault.

        Antwort auf mein Problem weißt du auch nicht??

        mfg
        bobby

        1. Antwort auf mein Problem weißt du auch nicht??

          Nein, da du bisher immer noch keine Beispielausgabe und genaue
          Fehlerbeschreibung gegeben hast. Mit deime OP ist in dieser Hinsicht
          nicht viel anzufangen, wie dir bereits mitgeteilt wurde.

  2. Ich habe mit dem folgendem Code ein Problem!!
    Was der Code ausgeben soll:
      Er soll ein csv-File beschreiben (öffnen mit MS excel) und die Kalenderwochen aufrufen, untereinander schreiben. Da bei manchen IP's keine Eintäge vorhanden sind, habe ich eine for-schleife eingetragen.

    schwer nachvollzuziehen ohne Datenbeispiel

    for ($kwweekcnt=1; $kwweekcnt<=$kwyear; ++$kwweekcnt){
        print PRINT ";KW: $kwweekcnt";
    }

    Du benutzt nicht use strict?
    zum entwickeln ist es so gut wie unverzichtbar, ohne ist es teilweise schwer Fehler zu finden.

    Ausserdem gibt es nur ganz wenig Szenarien, wo du eine solche C Typische Schleife benötigst. Perl bietet schönere Konstrukte
    for (1..$kwyear)
    {
       print PRINT ";KW: $_";
    }

    print PRINT "\n";
    #print data
    foreach $count_list (keys %ip_count) {

    wenn du alle Elemente erfassen willst ist es besser while und each zu verwenden.

    print PRINT "\n$ip_count{$count_list}{total};$count_list;";
        print PRINT "$ip_names{$count_list};";
        %weekcnt = %{$ip_count{$count_list}{week}};

    Hier würde ich eine HASH referenz benutzen.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. schwer nachvollzuziehen ohne Datenbeispiel

      Datenbeispiel vorhanden!

      Du benutzt nicht use strict?

      use strict wird benutzt!

      Ausserdem gibt es nur ganz wenig Szenarien, wo du eine solche C Typische Schleife benötigst. Perl bietet schönere Konstrukte

      Habe C gelernt, bin noch Perlneuling, deshalb for.

      wenn du alle Elemente erfassen willst ist es besser while und each zu verwenden.

      Hier würde ich eine HASH referenz benutzen.

      Werde ich mir zu Herzen nehmen!

      bobby

  3. Hell-O!

    foreach $week (keys %weekcnt) {
                if($week == $kwweekcnt) {
                    print PRINT "$weekcnt{$week}";
                }
                print PRINT ";";   #Um leere Spalten zu erzeugen
            }

    Da fehlt eine ELSE. Die print-Anweisung für leere Spalten wird *immer* ausgeführt, daher verschieben sich die Einträge, wenn die IF-Bedingung wahr ist. Siehe Bedingte Anweisungen mit if, else und elsif.

    Siechfred

    --
    Hier könnte Ihre Werbung stehen.
    Viel Lärm um nichts || Die neue 1%-Regelung
    1. Hell-O Ingrid!

      foreach $week (keys %weekcnt) {
                  if($week == $kwweekcnt) {
                      print PRINT "$weekcnt{$week}";
                  }
                  print PRINT ";";   #Um leere Spalten zu erzeugen
              }
      Da fehlt eine ELSE.

      Nicht nur, sondern auch ein Semikolon.

      foreach $week (keys %weekcnt) {  
        if($week == $kwweekcnt) {  
          print PRINT "$weekcnt{$week};";  
        }  
        else {  
          print PRINT ";";  
        }  
      }
      

      So sollte es m.E. gehen.

      Siechfred

      --
      Hier könnte Ihre Werbung stehen.
      Viel Lärm um nichts || Die neue 1%-Regelung
      1. Hallo,

        foreach $week (keys %weekcnt) {

        }

          
        Soweit ich mich dunkel erinnern kann liefert keys %hash keine sortierte Liste. Daher kann es durchaus sein, dass die Einträge durcheinandergewürfelt daherkommen. Ein Verdacht der durch die Ausgabe wie in <https://forum.selfhtml.org/?t=132011&m=854109> bestätigt wird.  
          
        Grüße  
          Klaus  
        
        
        1. Hell-O!

          Soweit ich mich dunkel erinnern kann liefert keys %hash keine sortierte Liste.

          Ja, du hast Recht, die Reihenfolge der keys entspricht der Reihenfolge der Hasheinträge im Speicher. Abhilfe sollte ein sort() schaffen:

          foreach $week (sort(keys %weekcnt))

          So oder so ähnlich :-)

          Siechfred

          --
          Hier könnte Ihre Werbung stehen.
          Viel Lärm um nichts || Die neue 1%-Regelung
    2. foreach $week (keys %weekcnt) {
                  if($week == $kwweekcnt) {
                      print PRINT "$weekcnt{$week}";
                  }
                  print PRINT ";";   #Um leere Spalten zu erzeugen
              }

      Da fehlt eine ELSE. Die print-Anweisung für leere Spalten wird *immer* ausgeführt, daher verschieben sich die Einträge, wenn die IF-Bedingung wahr ist.

      Der Kommentar ist nicht ganz richtig. Das print in der IF anweisung
      erzeugt keine neue Spalte, darum wird kein else verwendet!

      bobby