Schrift
[thread]12477[/thread]

Datei durchsuchen, älteste Einträge löschen!



<< >> 3 Einträge, 1 Seite
yasukatakaya
 2008-09-11 13:57
#114528 #114528
User since
2007-05-31
68 Artikel
BenutzerIn
[default_avatar]
Moin,
ich hab folgendes Problemchen, ich hab eine große Datei, mit diesem Ausschnitt
Code: (dl )
1
2
3
4
5
6
7
|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|||

diese will ich durchsuchen und zwar, soll z.b. die Zeilen
Code: (dl )
1
2
|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|||

gelöscht werden, da die Nummern 9507042402 und das Datum 23.06.2008 gleich sind,
aber die Zeit soll die JUNGSTE genommen werden, d.h. die älteren sollen gelöscht werden
in diesem Fall bleibt die erste Zeile für diese nummer:
Code: (dl )
|9507042402|23.06.2008|18:17:40|PASS|1|1|1|63.92762|46.3626594543457|||	   


Und wenn die ganze datei durchsucht werden soll, soll am ende das bleiben:
Code: (dl )
1
2
3
4
|9507042402|23.06.2008|18:17:40|PASS|1|1|1|63.92762|46.3626594543457|||	   
|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|||

Ich hoffe ihr hab mich verstanden, was ich löschen will, könnt ihr mir hier weiterhelfen?
bytebrain
 2008-09-11 14:54
#114529 #114529
User since
2008-07-21
20 Artikel
BenutzerIn
[default_avatar]
Hallo,

du musst die Datei in Array einlesen, das Array Zeile für Zeile durchsuchen.
Wenn deine Zeile das Suchkriterium (in deinem Fall das Datum|Uhrzeit) nicht erfüllt,
dann schreibe die Zeile in ein neues Array.
Überschreibe dann deine Datei mit den Daten aus dem neuen Array :-)


Gruß,
bytebrain
topeg
 2008-09-11 19:17
#114544 #114544
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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|||
<< >> 3 Einträge, 1 Seite



View all threads created 2008-09-11 13:57.