Autor Beitrag
Jörg Roth
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 17.09.07 15:02 
Hallo zusammen,
ich bin ganz neu hier und habe auch schon nach einem ähnlichen Thread zu meinem Thema gesucht, aber leider keinen gefunden :(

Es geht darum eine ca. 10 Megabyte große Log-Datei zu öffnen. (TXT-Format)

In dieser Datei sind alle Daten einer Maschine mitgeloggt. Das Problem ist, dass mit jedem neuen Job die Maschine die Logdatei nur erweitert. D.h. sie wird immer länger.
--> Daran kann ich nichts ändern, und das ist auch nicht mein Problem! Soweit nur als Info.

Meine Aufgabe besteht darin in der riesigen Log-Datei den letzten Job zu isolieren und darin nach bestimmten Ereignissen suchen.
Darum versuche ich nun die Textdatei mittels einem Streamreader zeilenweise in ein string-Array (jedes Element ist eine string-Zeile) einzulesen.

Wenn eine Zeile das Schlüsselwort "BVR-Start" enthält, 'vergesse' ich alles was ich bisher eingelesen habe und setze den Arrayindex auf 0.

Dadurch habe ich erreicht, dass nur der letzte Job, der ja vor kurzem ganz hinten an der riesigen Log-Datei angehängt wurde in meinem Array zeilenweise steht.



Mein Problem ist nun, dass das ganze bei ein paar Zeilen klappt, aber bei der Original-Log mit 10 MB ist meine CPU mit 100 % ausgelastet während dem zeilenweise öffnen :(

Ausserdem kann ich ja vorher nicht wissen, wie groß mein Array sein muss, d.h. wie viele Zeilen ich einlese.

Gibt es eine andere Möglichkeit???
Kann ich eine Text-Datei auch vom Ende her zeilenweise einlesen?

Vielen Dank für eure konstruktiven Tipps!
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 17.09.07 16:26 
Hi!

Ich habe das gerade mal mit einer 30MB Datei mit unten stehendem Quelltext getestet. Das dauert bei mir keine fünf Sekunden. Ich benutze allerdings auch eine generische Liste, um das Problem zu umgehen, dass ich die Anzahl der Zeilen nicht kenne.

ausblenden Chrome-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  var filename := 'e:\access-200708.log';
  
  var lines := new List<String>;
    
  using sr := new StreamReader(filename) do
    while not sr.EndOfStream do
    begin
      var line := sr.ReadLine;
      if line.Contains('22:38'then //wäre bei Dir 'BVR-Start'
        lines.Clear
      else
        lines.Add(line);  
    end;
    
  for l in lines do
    Console.WriteLine(l);
    
  Console.Readline;


Sorry, habe gerade kein C# da, aber es sollte sich leicht von Chrome nach C# portieren lassen.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 17.09.07 17:59 
user profile iconJörg Roth hat folgendes geschrieben:
Kann ich eine Text-Datei auch vom Ende her zeilenweise einlesen?
Natürlich kannst du das, auch wenn es keine vorgefertigte Methode wie File.ReadAllLines dafür gibt. Mithilfe von Stream.Seek und ReadByte wird deine selbst geschriebene Funktion nur schwer schlagbar sein - vor allem der RAM wird es dir danken ;) .