falsche ausgabe bei forschleife
bobby
- perl
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
}
}
}
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
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!
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.
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
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.
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
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.
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.
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
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
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
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
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
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