Laden...

Textdatei einlesen und nach Muster suchen

Erstellt von jofenchel vor 19 Jahren Letzter Beitrag vor 19 Jahren 3.445 Views
jofenchel Themenstarter:in
117 Beiträge seit 2005
vor 19 Jahren
Textdatei einlesen und nach Muster suchen

Hallo zusammen,
ich befasse mich nun seit ein paar Tagen mit C# und bin Anfaenger.
Ich habe ein Problem bzw eine Frage.

Wie kann ich eine ganz normale Textdatei, genauer gesagt ist es ein Trace von einer Anwendung die noch unter DOS laeuft, einlesen.
Die Datei kann aber schon mal 6 MB haben.
Nach dem Einlesen, oder eventuell waehrend dem einlesenn moechte ich nach einem bestimmten Textmuster suchen.
Ich weiss, es geht auch mit einem Editor aber ich moecht mir ein DOS-Programm schreiben das diese Aufgabe uebernimmt.
Als Parameter moechte ich den Namen der Datei und das Suchmuster eingeben.

Kann mir da jemand helfen oder einen Tip geben wo ich eventuell ein Stueck Source finden kann oder ein Tut?

Danke im voraus.

Gruss

Jo

P
939 Beiträge seit 2003
vor 19 Jahren

Mit Suchmuster meinst du wahrscheinlich reguläre Ausdrücke. Das .Net-Framework verwendet eine etwas aufgebohrte Posix Syntax. Man kann z.B. Gruppen benennen. Ansonsten ist alles wie bei anderen Engines - Perl, Java, kaum Unterschiede.

Zum Einlesen von Textdateien gibt es System.IO.File und System.IO.StreamReader. Man muss ein Encoding angeben für die Zeichenkodierung. Für reguläre Ausdrücke gibt es den System.Text.RegularExpressions-Namespace.

Beispiele für die Anwendung von regulären Ausdrücken gibt es im MSDN:
.NET Framework Regular Expressions

Gruss
Pulpapex

M
12 Beiträge seit 2005
vor 19 Jahren

warum einfach wenns auch kompliziert geht 🙂)
ich zitier jetzt mal die msdn, auch wenns eigentlich unsinn ist, da kann ja jeder nachgucken!

also wenns um strings geht mach ich das meist so:

Verwenden Sie für Vergleiche Compare, CompareOrdinal, CompareTo, Equals, EndsWith und StartsWith. Zum Abrufen des Indexes einer Teilzeichenfolge oder eines Unicode-Zeichens in einer Zeichenfolge verwenden Sie IndexOf, IndexOfAny, LastIndexOf und LastIndexOfAny.
49.485 Beiträge seit 2005
vor 19 Jahren

Hallo marting,

wenn es darum geht, einen einfachen Text wie 'Hallo' zu suchen, mag es mit IndexOf einfacher gehen. Aber schon bei 'Hallo Peter', das ich auch finden will, wenn zwischen Hallo und Peter (aus Versehen?) zwei oder mehr Leerzeichen stehen, wird es mit IndexOf richtig kompliziert, wogegen es mit RE angenehm entspannend bleibt.

herbivore

jofenchel Themenstarter:in
117 Beiträge seit 2005
vor 19 Jahren
In Textfile suchen

Hallo zusammen,
vielen Dank fuer die Tips.
Aber ich bin Anfaenger in C# und brauche irgend einen Beispielcode.
Oder ein Tut zum nachmachen und lernen und ausprobieren.

Gruss

Jo

M
12 Beiträge seit 2005
vor 19 Jahren

zu den einfachen methoden die ich beschrieben habe gibt es jeweils beispielcode in der msdn.
ist soundso zu empfehlen da reinzugucken.

also ich hab es dadurch jedenfalls gut verstanden, dass mit den REs ist vielleicht komplizierter, aber dazu kann ich nicht viel sagen.

P
939 Beiträge seit 2003
vor 19 Jahren

In der MSDN-Beschreibung zu System.IO.File ist ein Beispiel mit dabei wie man die Klassen File und StreamReader verwendet. Das Beispiel liest eine Datei zeilenweise mit StreamReader.ReadLine ein, was gut zu deiner Trace-Datei passen müsste.

Die einzelnen Textzeilen können meiner Meinung nach einfacher und flexibler mit einem regulären Ausdruck zerlegt werden. Das könnte z.B. so aussehen:


// Folgende Tracezeile mit dem beschriebenen Muster auswerten.
// Tracezeile: "2005/02/20 21:00 KATEGORIE Das ist eine Traceausgabe."
//
// tracePattern: (.{10})\\s+(.{5})\\s+(\\S+)\\s+(.*)
// Gruppen:      (group1)  (group2) (group3)(group4)
//
// group1: Datum     - 10 beliebige Zeichen.
// \\s+   :           - ein oder mehr Leerzeichen.
// group2: Zeit      - 5 beliebige Zeichen.
// \\s+   :           - ein oder mehr Leerzeichen.
// group3: Kategorie - alles ausser Leerzeichen.
// \\s+   :           - ein oder mehr Leerzeichen.
// group4: Text      - was noch übrigbleibt.
string tracePattern = @"(.{10})\\s+(.{5})\\s+(\\S+)\\s+(.*)";
Regex traceRegex = new Regex(tracePattern);

// Zu parsende Textzeile.
string traceLine = "2005/02/20 21:00 KATEGORIE Das ist eine Traceausgabe."

// Textzeile zerlegen in Datum, Zeit, Kategorie und Text.
Match m = traceRegex.Match(traceLine);
if(m.Success) {
  string datum     = m.Groups[1].Value;
  string zeit      = m.Groups[2].Value;
  string kategorie = m.Groups[3].Value;
  string text      = m.Groups[4].Value;
}

Kurz zur Erläuterung: Ausdrücke in Klammern sind Gruppen, die können im Ergebnis direkt abgefragt werden. Ein einfacher Punkt entspricht einem beliebigen Zeichen. Um einen richtigen Punkt zu finden, verwendet man ".". Der Ausdruck \s entspricht einem Leerzeichen oder einem anderen Whitespace (\t,\r,\n). Der Ausdruck \S entspricht allem außer einem Whitespace. +, * und {zahl} sind Quantifizierer, sie geben die Häufigkeit an wie oft der davor stehende Ausdruck vorkommen soll. Genaueres bitte dem schon oben angegebenen Link entnehmen: .NET Framework Regular Expressions

Gruss
Pulpapex

jofenchel Themenstarter:in
117 Beiträge seit 2005
vor 19 Jahren
Danke

Hallo Plupapex,

danke fuer den Link und das Beispiel. Super.
Das hat mir sehr geholfen.
Bin gerade am testen und ausprobieren.

Gruss

Jo