![]() |
Delphi-Version: 5
Zeichen aus einem String filtern/löschen
Hallöchen Leute!
Ich weiß zu diesem Thema gibts schon echt viel aber ich werde daraus nicht schlau. Ich habe eine ganze Zeile die miteinander verknüpft ist: beispiel Hallo<Wie.Gehts>denn.so Da habe ich jetzt die Aufgabe dass ich die Sonderzeichen filtere, lösche und am ende zusammenfüge.
Delphi-Quellcode:
ist nur ein Ansatz also... naja bitte um dringende Hilfe!! Der Anfang der Funktion wurde uns so gegeben,
function TForm1.Filter(lLine: String; out lDate: TDateTime; out lIdent: array of String; out lLogMessage,
lSeverityStatus: String): Boolean; begin for lLine := 0 to SetLength - 1 do begin Delete( end; end; Danke euch jetzt schon mal^^ |
AW: Zeichen aus einem String filtern/löschen
StringReplace, Copy, Pos, PosEx, Delete, ... Ich glaube, das sind so die wichtigsten Routinen, die man brauchen könnte, um das Problem zu lösen.
|
AW: Zeichen aus einem String filtern/löschen
Das ist ein bisserl wenig Info ... :)
Schreib doch mal auf, was dort übergeben wird und was als Rückgabewerte herauskommen soll.
Code:
Input:
lLine:string = "Hallo<Wie.Gehts>denn.so" Output: lDate:TDateTime = ? lIdent:array of string = ? lLogMessage:string = ? lSeverityStatus:string = ? Result:Boolean = ? |
AW: Zeichen aus einem String filtern/löschen
Delphi-Quellcode:
Input:
lLine:string = "[Hier ist das Datum]Hallo<Wie.Gehts>denn.so" Output: //hier wird die zeile eig gesplitet(wie gesagt eig aber wie weiß ich auch nicht genau) lDate:TDateTime = ?// das datum lIdent:array of string = ?// gute frage lLogMessage:string = ?// hier wärs dann "denn.so" von lLine lSeverityStatus:string = ? //Sternchen für fehler(wieviele sternchen da stehen Result:Boolean = ? //Rückgabetyp eben...?! |
AW: Zeichen aus einem String filtern/löschen
ich seh schon mein lehrer hat mir wieder zu wenig infos gegeben
|
AW: Zeichen aus einem String filtern/löschen
Hat Line immer diese Struktur ? "[Datum]<Ident>Text"
|
AW: Zeichen aus einem String filtern/löschen
Zitat:
|
AW: Zeichen aus einem String filtern/löschen
Du kannst mit Pos die Zeichen suchen: [, ], <, >. Dann hast du deren Index und kannst die Zeichen dazwischen mit Copy rauskopieren oder mit Delete löschen -- je nach dem, was du willst, das hab eich nämlich immer noch nicht verstanden.
|
AW: Zeichen aus einem String filtern/löschen
@Bjoerk
Genau so ist es aufgebaut |
AW: Zeichen aus einem String filtern/löschen
Zitat:
Zitat:
Zitat:
Worunter fällt denn dann das "Hallo" von "[Hier ist das Datum]Hallo<Wie.Gehts>denn.so"? :gruebel: |
AW: Zeichen aus einem String filtern/löschen
also hier ein beispiel [24.12.2011 23:00]<Bla><dann vielleicht der noch>bla.blaa
Das Hallo dazwischen war mist sry mein fehler... |
AW: Zeichen aus einem String filtern/löschen
Dann würde das ja bisher evtl. so aussehen
Code:
Input:
lLine:string = "[30.11.2011 11:23:34]<Ident1><Ident2>LogMessage" Output: lDate:TDateTime = 30.11.2011 11:23:34 lIdent:array of string = [ "Ident1", "Ident2" ] lLogMessage:string = "LogMessage" lSeverityStatus:string = ? Result:Boolean = ? |
AW: Zeichen aus einem String filtern/löschen
Genau das Sieht schon gut aus... Nur wie bekomm ich das jetzt gesplittet bevor ich die zeichen löche und so weiter... mit dem Result weiß ichauch grad nicht ganz was dabei rauskommen soll. der Status ist eben eine art Fehlermeldung. geht von einem * bis zu 3 *
|
AW: Zeichen aus einem String filtern/löschen
Die nötigen Funktionen dafür habe ich dir doch schon aufgezählt. Du musst sie nur anwenden. Und wenn du nicht weißt wie, dann guck in der Hilfe nach.
|
AW: Zeichen aus einem String filtern/löschen
Poste doch mal einen Beispieldatensatz (oder noch besser 2 verschiedene) mit dem beabsichtigten Ergebnis. Diese Raterei macht irgendwie keinen Spaß.
|
AW: Zeichen aus einem String filtern/löschen
[28.11.2011 16:54:04.875]:<PSSourceGraphThread> Reinit successful processed.
[28.11.2011 14:20:16.930]:<PSRenderGraphTCPBuilder><DS>Graph.Connect Naja Zerteilen dann die zeichen löschen und ganz später ne andere funktion solls dann kürzen aber das hab ich glaub ich schon Wie genau das nachher aussehen soll weiß ich auch net genau |
AW: Zeichen aus einem String filtern/löschen
Zitat:
Wo bitte kommt denn jetzt der Doppelpunkt her? |
AW: Zeichen aus einem String filtern/löschen
das ist das womit wir es machen sollen hatte den doppelpunkt wohl immer übersehen... so langsam macht mir diese aufgabe keinen spaß mehr
Also das ist irgendwas fürn server was der ausspuckt wie ich das verstanden habe und wenn man das in der eingabeaufforderung eingibt soll das dann gekürzt sein auf eine bestimmte zeilen länge... wieso ich das erst splitten soll keine ahnung |
AW: Zeichen aus einem String filtern/löschen
das hier hatte er und gegeben:
Parameter: -1. einzelne Zeile (out parameter) -2. Datum als TDateTime -3. Array of Ident (String) -4. Logmessage -5. severity Status (Fehler Anzahl *chen) Result: Boolean Parameter: -1. einzelne Zeile (outparameter) -2. Gekürzte Zeile Result: Boolean |
AW: Zeichen aus einem String filtern/löschen
BIs dahin hab ich schon was gebastelt
Delphi-Quellcode:
function TForm1.Filter(lLine: String; out lDate: TDateTime; out lIdent: array of String; out lLogMessage,
lSeverityStatus: String): Boolean; var Pos: Integer; begin Result:= false; for lLine := 1 to SetLength do begin if Pos:= Pos('<','>','[',']','*',':', lLine) then begin Delete(Pos); end; end; Result:= true; end; |
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:
|
AW: Zeichen aus einem String filtern/löschen
Zitat:
|
AW: Zeichen aus einem String filtern/löschen
Egal, er hat Democode für das Grundproblem, den Rest kann er machen.
|
AW: Zeichen aus einem String filtern/löschen
Also ich habs jetzt nur steht mir noch ein kleines Problem im wege
Delphi-Quellcode:
Also das ist jetzt eine Case-Anweisung. AIdent ist ein Array ebend für die einzelnen in <> stehenden werte. nur wenn ich die ausgeben lassen möchte, zeigt er mir nur das letzte Zeichen an. das Problem habe ich zweimal aber ich denke wenn ich das hab ist das andere auch kein Problem. 2: begin if not (ALine[i] in ['>']) then begin lBuffer := ALine[i]; end else begin AIdent[j] := lBuffer; // wird nur "S" angezeigt Ident.Text := AIdent[j]; lState := 1; Danke für eure Unterstützung!!! |
AW: Zeichen aus einem String filtern/löschen
Es ist zwar etwas wenig Info, aber möglicherweise hilft das hier:
Delphi-Quellcode:
if not (ALine[i] in ['>']) then
begin lBuffer := lBuffer + ALine[i]; end else |
AW: Zeichen aus einem String filtern/löschen
Was machst du da um Gottes Willen?
|
AW: Zeichen aus einem String filtern/löschen
:wall::wall::wall: Man, bin ich blöd!!
Perfekt! danke!! Wieso? es funktioniert alles bestens. Wenn ichs ganz fertig hab werd ich es euch zeigen |
AW: Zeichen aus einem String filtern/löschen
Jetzt möchte ich ja, dass alles aus dem Array in ein Textfeld übergeben werden und zwar wieder mit diesem Code:
Delphi-Quellcode:
habe schon einiges versucht aber es funktioniert irgendwie nicht. soll Auch eigentlich nur zum Test sein, ob er auch wirklich alles aus dem Array ausgibt
2:
begin if not (ALine[i] in ['>']) then begin lBuffer := lBuffer + ALine[i]; end else begin AIdent[j] := lBuffer ; Ident.Text := AIdent[j]; lState := 1; lBuffer := ''; end; |
AW: Zeichen aus einem String filtern/löschen
Ich möchte doch bloß die werte im array in meinem Edit haben -.-
|
AW: Zeichen aus einem String filtern/löschen
Luckie hat doch in #14 bereits alles vorgekaut oder gar vorverdaut .....
|
AW: Zeichen aus einem String filtern/löschen
Aber ja nicht dafür jetzt. Ich möchte ja jetzt bloß Das komplatte Array in meinem Edit rein haben aber was da bis jetzt ist gibt mir nur den letzten index wieder.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz