![]() |
AW: Zeichen aus einem String filtern/löschen
Zitat:
Das hört sich irgendwie nach "Geh mah und hol wat zum Kuchen backen" denn ausser "Kuchen" ist hier nix klar. Versuch mit der Information mal die Zutaten für den Kuchen zu kaufen. Richtig, geht auch nicht. Also mal die Mitschüler oder auch den Lehrer gefragt. |
AW: Zeichen aus einem String filtern/löschen
Also so schwer ist das ja eigentlich nicht. In die Funktion rein geht der String vom Server, wahrscheinlich wird da was geloggt. Rauskommen soll der in seine Bestandteile zerlegte String.
Delphi-Quellcode:
Das sagt eigentlich schon alles, was passieren soll.
procedure SplitLogLine(LogLine: string; out TimeStamp: string; out Indent1: string; out Indent2: string; out LogMessage: string);
Jetzt haben wir noch den Aufbau von dem String der vom Server kommt:
Code:
Mit Pos und PosEx kann ich jetzt nach "[", "]", "<" und ">" suchen und mit Copy die Bestandteile in die out Parameter kopieren. Kein Problem. Eigentlich nur eine Fingerübung, wenn da jetzt nicht noch eine kleine Gemeinheit wäre. So wie es aussieht, ist Inden2 optional, also nicht in jeder LogLine enthalten. Aber auch das lässt sich lösen, in dem man eine Fallunterscheidung macht in Abhängigkeit von der Anzahl der "<".
[TimeStamp]:<Indent1><Indent2>LogMessage
Ich denke, das sollte auch für einen Anfänger lösbar sein. Sieh und Zweck der Übung ist es wohl, dass ihr die Zeichenmanipuilationsroutinen (Pos, PosEx, Copy, Delete) von Delphi kennen lernen sollt. So, deswegen guck mal in der Hilfe, was die Routinen machen und wie man sie anwendet. Wenn du das verstanden hast, sollte es kein Problem sein, die Aufgabe zu lösen. |
AW: Zeichen aus einem String filtern/löschen
Danke!!!
Ich hatte mir auch grad was überlegt: Wenn ich immer nach diesen Zeichen es in einem Buffer speichern lasse und ab dem zeichen was grad ausgemacht wurde weiter suche usw. Das könnte doch auch gehen... |
AW: Zeichen aus einem String filtern/löschen
Was für ein Buffer?
Delphi-Quellcode:
(Dauer 10 Minuten, inklusive starten der IDE und suchen nach einer PosEx Funktion hier im Forum.)
program Project2;
{$APPTYPE CONSOLE} uses SysUtils; const LINE = '[TimeStamp]:<Indent1><Indent2>LogMessage'; function ExtractTimeStamp(LogLine: string): string; var Start, Stop: Integer; begin Start := Pos('[', LogLine); Stop := Pos(']', LogLine); Result := Copy(LogLine, Start + 1, Stop - Start - 1); end; function ExtractIndent1(LogLine: string): string; var Start, Stop: Integer; begin Start := Pos('<', LogLine); Stop := Pos('>', LogLine); Result := Copy(LogLine, Start + 1, Stop - Start - 1); end; function ExtractIndent2(LogLine: string): string; var Start, Stop: Integer; Start2, Stop2: Integer; begin Start := Pos('<', LogLine); Start2 := PosEx('<', LogLine, Start + 1); // +1, sonst findet er das erste Zeichen wieder Stop := Pos('>', LogLine); Stop2 := PosEx('>', LogLine, Stop + 1); Result := Copy(LogLine, Start2 + 1, Stop2 - Start2 -1); end; function ExtractLogMsg(LogLine: string): string; var Start, Start2: Integer; begin Start := Pos('>', LogLine); Start2 := PosEx('>', LogLine, Start + 1); // +1, sonst findet er das erste Zeichen wieder Result := Copy(LogLine, Start2 + 1, Length(LogLine) - Start2); end; procedure SplitLogLine(LogLine: string; out TimeStamp: string; out Indent1: string; out Indent2: string; out LogMsg: string); begin TimeStamp := ExtractTimeStamp(LogLine); Indent1 := ExtractIndent1(LogLine); Indent2 := ExtractIndent2(LogLine); LogMsg := ExtractLogMsg(LogLine); end; var TimeStamp: string; Indent1: string; Indent2: string; LogMsg: string; begin SplitLogLine(LINE, TimeStamp, Indent1, Indent2, LogMsg); Writeln(TimeStamp); Writeln(Indent1); Writeln(Indent2); Writeln(LogMsg); Readln; end. Die Fallunterscheidung überlasse ich dir. |
AW: Zeichen aus einem String filtern/löschen
Also nicht direkt einen Buffer... also naja nur eben dass ich das eben dann irgendwo speichere wenn ich die positionen zwischen den einzelnen zeichen ausgemach habe...
Der Code wäre nicht nötig gewesen aber ich danke danke danke dir^^ |
AW: Zeichen aus einem String filtern/löschen
Du meinst das, was ich Start und Stop genannt habe?
|
AW: Zeichen aus einem String filtern/löschen
Ja genau...
Delphi-Quellcode:
Wieso nimmst du hier start + 1 und stop-start-1? das verstehe ich nicht ganz
Copy(LogLine, Start + 1, Stop - Start -1);
|
AW: Zeichen aus einem String filtern/löschen
Dann guck in der Hilfe nach, wie Copy funktioniert.
|
AW: Zeichen aus einem String filtern/löschen
Wieso denn jetzt dieser Aufruf
Delphi-Quellcode:
Eben hatten wir noch ein Array in den Parametern?
procedure SplitLogLine(LogLine: string; out TimeStamp: string; out Indent1: string; out Indent2: string; out LogMsg: string);
Und es war eine Funktion? Und was ist mit den Sternchen? Habe ich da was nicht mitbekommen? |
AW: Zeichen aus einem String filtern/löschen
Das wäre meine Lösung der Aufgabe ohne Rücksicht was der Lehrer vorgibt; das war mir etwas wirr. Und was ich nicht verstanden habe, habe ich einfach weggelassen. :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz