Thread Datei durchsuchen, älteste Einträge löschen!
(2 answers)
Opened by yasukatakaya at 2008-09-11 13:57
Mal kurz was zusammen gepfuscht:
Um Speicher zu sparen merke ich mir die Position in der Datei und nicht die Zeile selber. Code (perl): (dl
)
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 #!/usr/bin/perl use strict; use warnings; use Time::Local; use Date::Calc qw(Day_of_Year); my @found=(); # position in der datei bestimmen my $pos_in_file=tell(DATA); while(my $line=<DATA>) { # zeile zerlegen my @l=split(/\|/,$line); # datum/zeit zerlegen my @t=split(/[\.:]/, $l[3].".".$l[2]); # timestamp bilden my $ts=timegm($t[2],$t[1],$t[0],$t[3],$t[4]-1,$t[5]-1900); # tag im jahr finden my $doy=Day_of_Year($t[5],$t[4],$t[3]); # zeile testen my $add=1; for my $i (reverse(0..$#found)) { my @f=@{$found[$i]}; if($f[0] eq $l[1] and $f[2] == $doy) { $add=0; if($f[1] >= $ts) { splice(@found,$i,1); $add=1; last; } } } # zeile hinzufügen wenn alles ok push(@found,[$l[1],$ts,$doy,$pos_in_file]) if($add); $pos_in_file=tell(DATA); } # das ergebnis ausgeben for my $p (@found) { seek(DATA,$p->[-1],0); my $line=<DATA>; ### AUSGABE: ### print $line; } __DATA__ |9507042402|23.06.2008|18:17:40|PASS|1|1|1|63.92762|46.3626594543457||| |9507042402|23.06.2008|18:18:49|FAIL|1|1|1|63.36795|46.3676109313965||| |9507042402|23.06.2008|18:28:39|FAIL|1|1|1|63.36795|46.3676109313965||| |9507164212|23.06.2008|18:52:35|FAIL|1|1|1|75.30767|46.3609733581543||| |9507164212|23.06.2008|18:46:14|PASS|1|1|1|63.37932|46.3660926818848||| |9507164215|23.06.2008|18:51:05|FAIL|1|1|1|66.22319|46.3735771179199||| |9507164208|23.06.2008|18:27:28|PASS|1|1|1|70.04309|46.3699073791504||| |