1
2
3
4
5
6
7
8
9
10
11
12
13
#################################################
# Multi-Post-Blocker (MPB) / Mehrfachpostsperre #
#################################################
open(FILEMANAGER, "+>>coresys/incoming.csv") or die "ERROR: Unable to open the IC-file!";
flock(FILEMANAGER, LOCK_EX);
while(! eof(FILEMANAGER))
{
my $zeile = <FILEMANAGER>;
my ($DB_customstorycode, $DB_headline, $DB_benutzergeschichte, $DB_zaehler, $DB_internetpost, $DB_tbgelesen, $DB_IPAdresse, $DB_Monatstag, $DB_Monat, $DB_Jahr, $DB_Stunden, $DB_Minuten, $DB_Sekunden, $DB_clientdatakey,) = split(/;/,$zeile);
push (@FileData, $zeile);
}
2012-06-25T20:35:03 ?Was ich erreichen möchte:
Ich möchte folgende Skalare aus dem Array haben:
Je die $DB_IPAdresse plus die zugehörigen Werte wie
- $DB_Monatstag ...
Ich habe im Programm bereits die aktuell zu schreibende IP. Diese möchte ich mit sämtlichen IP im Array vergleichen. Gibt es einen Treffer (SameIP),
muss die dazugehörige Datum und Zeit ausgelesen werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; open(my $filemanagerFH, "<", "coresys/incoming.csv") or die "ERROR: Unable to open the IC-file: $!"; my %hoh; # Meine verschachtelte Datenstruktur while (my $zeile = <$filemanagerFH>) { chomp $zeile; my ($DB_customstorycode, $DB_headline, $DB_benutzergeschichte, $DB_zaehler, $DB_internetpost, $DB_tbgelesen, $DB_IPAdresse, $DB_Monatstag, $DB_Monat, $DB_Jahr, $DB_Stunden, $DB_Minuten, $DB_Sekunden, $DB_clientdatakey) = split(/;/,$zeile); $hoh{$DB_IPAdresse} = { customstorycode => $DB_customstorycode , headline => $DB_headline , benutzergeschichte => $DB_benutzergeschichte , zaehler => $DB_zaehler , internetpost => $DB_internetpost , tbgelesen => $DB_tbgelesen , Monatstag => $DB_Monatstag , Monat => $DB_Monat , Jahr => $DB_Jahr , Stunden => $DB_Stunden , Minuten => $DB_Minuten , Sekunden => $DB_Sekunden , clientdatakey => $DB_clientdatakey }; print Dumper \%hoh; # Wie sieht meine Datenstruktur aus? print $hoh{$DB_IPAdresse}->{benutzergeschichte}; # Ein Beispielzugriff }
1
2
3
4
5
6
while(! eof(FILEMANAGER))
{
my $zeile = <FILEMANAGER>;
my ($DB_customstorycode, $DB_headline, $DB_benutzergeschichte, $DB_zaehler, $DB_internetpost, $DB_tbgelesen, $DB_IPAdresse, $DB_Monatstag, $DB_Monat, $DB_Jahr, $DB_Stunden, $DB_Minuten, $DB_Sekunden, $DB_clientdatakey) = split(/;/,$zeile);
if ($DB_IPAdresse eq $IPAdresse and $DB_Monatstag eq $Monatstag and $DB_Monat eq $Monat and $DB_Jahr eq $Jahr and $DB_Stunden eq $Stunden and $DB_Minuten eq $Minuten) {#'innerhalb der Speerzeit';}
}
2012-06-26T06:34:31 payxad a): Das ist ja im Thread Datenhandling ganz allgm. gefragt schon ausführlich diskutiert werden. Auf jeden Fall stimmt: CSV besser mit geeigneten Modulen auslesen, keine Frage. Warum machst Du das nicht, HP-User?
QuoteIch möchte folgende Skalare aus dem Array haben:
2012-06-26T05:01:03 rostiGenau deswegen ist ein Hash besser geeignet: Die Scalare haben dann Namen.
http://rolfrost.de/map/perlbase/csv_names.html
QuoteUnd genau deswegen sollte er JSON statt CSV nehmen.
print $file to_json($hash_ref);
Guest MuffiCSV ist gegeben? Dann hab ich was überlesen. Ich hab im anderen Thread noch sowas wie "normalerweise speichere ich sowas in CSV" im Kopf.
QuoteIch habe eine CSV-Datei ...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
while(my $zeile = <FILEMANAGER>) { # Zeilenumbruch entfernen chomp($zeile); my ($DB_customstorycode, $DB_headline, $DB_benutzergeschichte, $DB_zaehler, $DB_internetpost, $DB_tbgelesen, $DB_IPAdresse, $DB_Monatstag, $DB_Monat, $DB_Jahr, $DB_Stunden, $DB_Minuten, $DB_Sekunden, $DB_clientdatakey,) = split(/;/,$zeile); # nun kann man alle werte in @FileData speichern. # perl kann auch mit mehrdimensionalen Arrays umgehen # hier wird ein zweidimensionales benutzt: my $pos=@FileData; $FileData[$pos][0] = $DB_customstorycode; $FileData[$pos][1] = $DB_headline; $FileData[$pos][2] = $DB_benutzergeschichte; $FileData[$pos][3] = $DB_zaehler; $FileData[$pos][4] = $DB_internetpost; $FileData[$pos][5] = $DB_tbgelesen; $FileData[$pos][6] = $DB_IPAdresse; $FileData[$pos][7] = $DB_Monatstag; $FileData[$pos][8] = $DB_Monat; $FileData[$pos][9] = $DB_Jahr; $FileData[$pos][10] = $DB_Stunden; $FileData[$pos][11] = $DB_Minuten; $FileData[$pos][12] = $DB_Sekunden; $FileData[$pos][13] = $DB_clientdatakey; }
1 2 3 4 5 6 7 8 9 10 11
while(my $zeile = <FILEMANAGER>) { # Zeilenumbruch entfernen chomp($zeile); #die Zeile splitten und die Einzelwerte in @data speichern my @data=split(/;/,$zeile); #Das Array @data als Element in das Array @FileData schreiben. push(@FileData,\@data); }
1 2 3 4 5 6 7 8 9 10 11 12
while(<FILEMANAGER>) { # Zeilenumbruch entfernen # wenn nicht angeben wurde wird "$_" benutzt chomp; #die Zeile splitten und die Einzelwerte in @data speichern my @data=split(/;/,$_); #Das Array @data als Element in das Array @FileData schreiben. push(@FileData,\@data); }
1 2 3 4 5 6 7 8 9
while(<FILEMANAGER>) { # Zeilenumbruch entfernen # wenn nicht angeben wurde wird "$_" benutzt chomp; #Das Array @data als Element in das Array @FileData schreiben. push(@FileData,[ split(/;/,$_) ]); }
chomp and push(@FileData,[ split(/;/,$_) ]) while(<FILEMANAGER>);
1 2 3 4 5 6 7 8 9 10 11
my $gesuchte_ip='192.168.111.111'; my ($DB_customstorycode, $DB_headline, $DB_benutzergeschichte, $DB_zaehler, $DB_internetpost, $DB_tbgelesen, $DB_IPAdresse, $DB_Monatstag, $DB_Monat, $DB_Jahr, $DB_Stunden, $DB_Minuten, $DB_Sekunden, $DB_clientdatakey); for my $eintrag (@FileData) { my @data=@$eintrag; if($data[6] eq $gesuchte_ip) { ($DB_customstorycode, $DB_headline, $DB_benutzergeschichte, $DB_zaehler, $DB_internetpost, $DB_tbgelesen, $DB_IPAdresse, $DB_Monatstag, $DB_Monat, $DB_Jahr, $DB_Stunden, $DB_Minuten, $DB_Sekunden, $DB_clientdatakey)=@data; last; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
my $gesuchte_ip='192.168.111.111'; my ($DB_customstorycode, $DB_headline, $DB_benutzergeschichte, $DB_zaehler, $DB_internetpost, $DB_tbgelesen, $DB_IPAdresse, $DB_Monatstag, $DB_Monat, $DB_Jahr, $DB_Stunden, $DB_Minuten, $DB_Sekunden, $DB_clientdatakey); for( my $pos=0; $pos<@FileData; $pos++ ) { if( $data[$pos][6] eq $gesuchte_ip ) { $DB_customstorycode = $data[$pos][0]; $DB_headline = $data[$pos][1]; $DB_benutzergeschichte = $data[$pos][2]; $DB_zaehler = $data[$pos][3]; $DB_internetpost = $data[$pos][4]; $DB_tbgelesen = $data[$pos][5]; $DB_IPAdresse = $data[$pos][6]; $DB_Monatstag = $data[$pos][7]; $DB_Monat = $data[$pos][8]; $DB_Jahr = $data[$pos][9]; $DB_Stunden = $data[$pos][10]; $DB_Minuten = $data[$pos][11]; $DB_Sekunden = $data[$pos][12]; $DB_clientdatakey = $data[$pos][13]; last; } }
2012-06-26T09:48:46 topegwhile(! eof(FILEMANAGER)) ist korrekt aber hier nicht nötig. Man kann prüfen, ob die Zeile Überhaubt etwas enthält. Denn auch leere Zeilen in der Datei enthalten Mindestens ein "\n" So kann man schreiben: while(my $zeile = <FILEMANAGER>)