Schrift
[thread]12480[/thread]

Perl log-file nach timestamps sortieren



<< >> 3 Einträge, 1 Seite
Gast Gast
 2008-09-12 00:05
#114554 #114554
Hallo,

ich stehe vor einem für mich schwieriges Problem. Und zwar habe ich hier ein log-file, eine Zeile ist jeweils ein zusammengehöriger Eintrag.

In jeder Zeile ist ein timestamp enthalten. Teilweise sind diese timestamps doppelt aufgrund der geringen Auflösung. Erschwerend kommt hinzu, dass die einzelnen Zeilen ungeordnet in das log-file purzeln. Nun möchte ich gerne das komplette file zeilenweise sortieren, und zwar nach timestamps. Bei Zeilen, die den gleichen timestamp enthalten ist es egal in welcher Reihenfolge sie kommen.

Vereinfacht sieht das log-file so aus:

Code: (dl )
1
2
3
4
5
6
0001 Ein Eintrag
0002 Noch ein Eintrag
0008 Ein weiterer Eintrag
0003 Und alles auch noch durcheinander
0008 Und aufgrund der geringen Auflösung auch noch gleiche timestamps
0010 Und es geht immer so weiter...


Mein erster Ansatz war nun wie folgt. Die komplette Datei zeilenweise in ein array einlesen. Nebenher in ein weiteres array den timestamp herauspfriemeln. Damit habe ich dann bereits den timestamp isoliert an Index X des timestamp-arrays, und die zugehörige Zeile des Zeilen-arrays ebenfalls an Index X. Dann habe ich das ganze in einen Hash gepackt, also Schlüssel wäre der timestamp und Wert dann die komplette zugehörige Zeile.

Der Masterplan sah dann so aus, dass ich die Schlüssel sortieren wollte (kein Problem), und dann über die sortierten Schlüssel in einem foreach-loop das Hash komplett durchgehen und in eine Datei speichern.

Leider geht das natürlich nicht, da ich ja doppelte Schlüssel habe (wegen der zu geringen Auflösung der timestamps). Bis ich das mal gemerkt habe hat es ja schon lange genug gedauert, aber jetzt hab ich irgendwie überhaupt keine Idee wie das zu lösen sein könnte.

Hat da vielleicht jemand eine zündende Idee?

Dankeschön...
pktm
 2008-09-12 00:26
#114556 #114556
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja, lies die Datei zeilenweise ein, spalte jede Zeile in Timestamp und Inhalt auf und jag dann eine schwartzsche Transformation drüber.

Ich weiß nicht, ob das mit Kanonen auf Spatzen geschossen ist, aber es ist ein Ansatz.

Oder du verwendest das Modul CPAN:Data::Table dafür.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
topeg
 2008-09-12 01:14
#114557 #114557
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Anhand deines Beispieles:

Die kurze Version (langsam, Speicherhungrig)
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;

my @data=<DATA>;

@data=sort{my($aa)=$a=~/^(\d+)/; my ($bb)=$b=~/^(\d+)/; $aa <=> $bb}@data;

print join('',@data)."\n";

__DATA__
0001 Ein Eintrag
0002 Noch ein Eintrag
0008 Ein weiterer Eintrag
0003 Und alles auch noch durcheinander
0008 Und aufgrund der geringen Auflösung auch noch gleiche timestamps
0010 Und es geht immer so weiter...


Oder schneller, mit weniger Speicherverbrauch:
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
#!/usr/bin/perl
use strict;
use warnings;

my @array=();
my $pos=tell(DATA);
while(my $line=<DATA>)
{
  my ($time)=$line=~/^(\d+)/;
  push(@array,[$time,$pos]);
  $pos=tell(DATA);
}

for my $p (sort{$a->[0] <=> $b->[0]}@array)
{
  seek(DATA,$p->[1],0);
  my $line=<DATA>;
  ### AUSGABE ###
  print $line;
}

__DATA__
0001 Ein Eintrag
0002 Noch ein Eintrag
0008 Ein weiterer Eintrag
0003 Und alles auch noch durcheinander
0008 Und aufgrund der geringen Auflösung auch noch gleiche timestamps
0010 Und es geht immer so weiter...


und noch eine Möglichkeit (recht schnell aber Speicherhungrig):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;

my @data=map{$_=~/^(\d+)/;$_=[$1,$_]}(<DATA>);
@data=sort{$a->[0] <=> $b->[0]}@data;

for my $p (@data)
{ print $p->[1]; }

__DATA__
0001 Ein Eintrag
0002 Noch ein Eintrag
0008 Ein weiterer Eintrag
0003 Und alles auch noch durcheinander
0008 Und aufgrund der geringen Auflösung auch noch gleiche timestamps
0010 Und es geht immer so weiter...
<< >> 3 Einträge, 1 Seite



View all threads created 2008-09-12 00:05.