Laden...

.log File in Tabelle ausgeben

Letzter Beitrag vor 16 Jahren 14 Posts 2.544 Views
.log File in Tabelle ausgeben

Guten Tag,
ich habe ein Problem. Und zwar habe ich eine .txt Datei, welche wie folgt gegliedert ist:

Datum ; xxxxxxxxx ; xxxxxxxxx ; xxxxxxxx ; xxxxxxx ; xxxxxxxx
Datum ; xxxxxxxxx ; xxxxxxxxx ; xxxxxxxx ; xxxxxxx ; xxxxxxxx

Diese Datei möchte ich in einem Grid als Tabelle ausgeben.
Wie lese ich die einzelnen Werte am Besten ein und speicher diese im Grid?
Und wie erkenne ich beim einlesen wann eine neue Zeile beginnt?

Gruß
knelt

Hallo,

lese die Datei einfach Zeilenweise ein, dann musst du dich nicht ums Zeilenende kümmern. Dazu würde ich einen StreamReader nehmen, was dann in etwas so aussehen würde.


using (StreamReader reader = new StreamReader("DeineLog.log"))
{
  while ((line = reader.ReadLine()) != null)
  {
    // Hier kannst du jetzt den eingelesenen String zerpflücken
    string[] fields = line.Split(new char[] { ';' });
  }
}

So, den Rest wie du es in eine DataTable klatscht und in einem Grid anzeigt, überlasse ich mal dir. Das ist nicht so schwer...

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Probiers mal so:


//Hiermit landet jede Zeile als ein Eintrag in einem String Array
String [] allLines = File.ReadAllLines(FILEPATH) 

Und ein DataGridView würd ich in Deinem Fall "perHand befüllen", d.h.:


1. Spalten vorher festlegen, Bsp:

this.dataGridView.ColumnCount = 4;
this.dataGridView.Columns[0].Name = "Datum";
this.dataGridView.Columns[1].Name = "xyz";
this.dataGridView.Columns[2].Name = "xyz2";

2. Deine Zeilen Array durch iterieren und dann Dein DataGridView so in etwa  befüllen:

private void addNewFilledRowInDataGridView(String i_datum, String i_xyz, String i_xyz2)
{

            //Add new values in GridView
            this.dataGridView.Rows.Add(1);

            this.dataGridView[0, this.dataGridView.Rows.Count - 1].Value = i_datum;
            this.dataGridView[1, this.dataGridView.Rows.Count - 1].Value = i_xyz;
            this.dataGridView[2, this.dataGridView.Rows.Count - 1].Value = i_xyz2;
}

Hey,
schon mal danke.
Aber in der .log File ist ein Datensatz leider nicht nur immer eine Zeile lang.
Denn der letzte Wert kann praktisch beliebig lang sein. Manchmal 10 Zeilen lang oderso(Fehlermeldung)...
d.h. ich muss die Zeilen irgendwie durchs Datum identifizieren.

@knelt:
Es gibt so viele Logfile-Parser, da findet sich bestimmt einer auf codeproject, codeplex oder sourceforge, der das kann was du brauchst.

@Joetempes:
Das halten der Daten im Grid ist eine scheussliche angewohnheit.
Das grid ist nur zur anzeige gedacht, nicht zu datenhaltung.

Original von FZelle

@Joetempes:
Das halten der Daten im Grid ist eine scheussliche angewohnheit.
Das grid ist nur zur anzeige gedacht, nicht zu datenhaltung.

Er hält duch die Daten im LogFile. Ich würde Sie halt nur aufbereitet im Grid anzeigen.
Oder versteh ich was falsch?

Mein Hauptproblem liegt darin, dass ein Datensatz nicht nur in einer Zeile steht und ich deswegen nicht weiß wann der neue Datensatz beginnt.
Datum ; xxxxxxxxx ; xxxxxxxxx ; xxxxxxxx ; xxxxxxx ; xxxxxxxx
Der letzte Abschnitt ist wie gesagt manchmal 10 Zeilen lang oderso...
Kann ich beim spliten auch irgendwie sagen, dass der z.b. nach dem 5. ";" alles in ein Feld speichert bis ein neues Datum kommt -> Dann wieder neuer Datensatz.

Also, die Daten sehen aber dennoch immer so aus:

DATUM; xxxx; xxxx; xxxx
DATUM; xxxx; xxxx; xxxx

oder auch

DATUM; xxxx; xxxx; xxxx; DATUM
xxxx; xxxx; xxxx; DATUM; xxxx; xxxx;
xxxx

Sprich, ein Datum markiert den Datensatzanfang?

Wenn ja, hat das Datum ein bestimmtes Format? Wenn ja, den Krams per RegEx splitten (könnte aber bei großen Datein recht unperformant sein).

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Also so sieht das im schlimmsten Fall aus:

Datum ; xxxxxxxxx ; xxxxxxxxx ; xxxxxxxx ; xxxxxxx ; xxxxxxxx
Datum ; xxxxxxxxx ; xxxxxxxxx ; xxxxxxxx ; xxxxxxx ; xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Datum ; xxxxxxxxx ; xxxxxxxxx ; xxxxxxxx ; xxxxxxx ; xxxxxxxx

Das heißt am Ende eines Datensatzes kommt kein ";".
Eigentlich kann man die Datensätze nur duch das Datum festmachen.
Das datum hat ein normales DateTimeFormat
also: 30.10.2007 13:11:28

Habe auch schon an Regex gedacht, aber habe bisher nur einfache Dinge mit Regex gemacht und wüsste jetzt nicht wie ich das realisieren sollte...
und die log files sind schon sehr riesig..also so ca. 5mb

Kann es sein dass die lange Zeile von dir nur vom Editor umgebrochen wird? Kann mir kaum vorstellen dass dort wirklich ein echter Umbruch ist (LF/CR). Dann sollte nähmlich auch Khalids Vorschlag gehen.

Nein, es sind tatsächlich Zeilenumbrüche da.

Das Problem hatte ich auch gerade.

Du musst eine Variable anlegen die die aktuelle Zeile enthält und eine, die das Endergebnis des Parservorgangs enthält. Beim Durchlaufen der Zeilen stellst du fest "Hier ist ein Datum, da beginnt eine neue Zeile", also hängst du die geparste Zeile an den Ergebnisarray an und beginnst mit einer neuen aktuellen Zeile.
Beginnt die Zeile nicht mit einem Datum, dann hängst du den inhalt der gelesenen Zeile nicht an den Ergebnisarray sondern an das entsprechende Feld der aktuellen Zeile...

Gruß,
Markus 🙂

@Joetempes:
Ja, du hast da etwas falsch verstanden, du willst im Programm die Daten im Grid
selber halten, und nicht in einer Liste/DataTable o.ä.
Und das ist eine schlechte angewohnheit.

Habe die Daten jetzt in ein Array eingelesen und dann immer sofort in einer neuen Zeile im Grid ausgegeben. Es handelt sich hierbei um eine Webanwendung und ist sehr sehr langsam bei einer großen Datei. Wie beschleunige ich das, oder wo speicher ich die Daten der TextDatei am besten?
mfg