Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zeichen aus einem String filtern/löschen (https://www.delphipraxis.net/164771-zeichen-aus-einem-string-filtern-loeschen.html)

Blubbel 29. Nov 2011 13:07

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:
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;
ist nur ein Ansatz also... naja bitte um dringende Hilfe!! Der Anfang der Funktion wurde uns so gegeben,
Danke euch jetzt schon mal^^

Luckie 29. Nov 2011 13:12

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.

Sir Rufo 29. Nov 2011 13:16

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 = ?

Blubbel 29. Nov 2011 13:23

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...?!

Blubbel 29. Nov 2011 13:26

AW: Zeichen aus einem String filtern/löschen
 
ich seh schon mein lehrer hat mir wieder zu wenig infos gegeben

Bjoerk 29. Nov 2011 17:54

AW: Zeichen aus einem String filtern/löschen
 
Hat Line immer diese Struktur ? "[Datum]<Ident>Text"

Uwe Raabe 29. Nov 2011 18:27

AW: Zeichen aus einem String filtern/löschen
 
Zitat:

Zitat von Blubbel (Beitrag 1138410)
ich seh schon mein lehrer hat mir wieder zu wenig infos gegeben

Wenn er denn selbst überhaupt weiß, was er will...

Luckie 29. Nov 2011 19:20

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.

Blubbel 30. Nov 2011 10:50

AW: Zeichen aus einem String filtern/löschen
 
@Bjoerk

Genau so ist es aufgebaut

Sir Rufo 30. Nov 2011 10:54

AW: Zeichen aus einem String filtern/löschen
 
Zitat:

Zitat von Bjoerk (Beitrag 1138467)
Hat Line immer diese Struktur ? "[Datum]<Ident>Text"

Zitat:

Zitat von Blubbel (Beitrag 1138556)
@Bjoerk

Genau so ist es aufgebaut

Zitat:

Zitat von Blubbel (Beitrag 1138409)
Delphi-Quellcode:
Input:
lLine:string = "[Hier ist das Datum]Hallo<Wie.Gehts>denn.so"

:wiejetzt:

Worunter fällt denn dann das "Hallo" von "[Hier ist das Datum]Hallo<Wie.Gehts>denn.so"? :gruebel:

Blubbel 30. Nov 2011 11:03

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...

Sir Rufo 30. Nov 2011 11:24

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 = ?

Blubbel 30. Nov 2011 11:44

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 *

Luckie 30. Nov 2011 11:48

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.

DeddyH 30. Nov 2011 11:48

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ß.

Blubbel 30. Nov 2011 11:58

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

Sir Rufo 30. Nov 2011 12:01

AW: Zeichen aus einem String filtern/löschen
 
Zitat:

Zitat von Blubbel (Beitrag 1138570)
[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

Ich habe irgendwie das Gefühl, dass der String sich immer wieder ändert :roll:

Wo bitte kommt denn jetzt der Doppelpunkt her?

Blubbel 30. Nov 2011 12:03

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

Blubbel 30. Nov 2011 12:21

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

Blubbel 30. Nov 2011 12:49

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;

Sir Rufo 30. Nov 2011 13:23

AW: Zeichen aus einem String filtern/löschen
 
Zitat:

Zitat von Blubbel (Beitrag 1138572)
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

Ich nehme jetzt mal stark an, du hast da ein paar ganz entscheidende Sachen im Unterricht nicht mitbekommen.
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.

Luckie 30. Nov 2011 14:22

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:
procedure SplitLogLine(LogLine: string; out TimeStamp: string; out Indent1: string; out Indent2: string; out LogMessage: string);
Das sagt eigentlich schon alles, was passieren soll.

Jetzt haben wir noch den Aufbau von dem String der vom Server kommt:
Code:
[TimeStamp]:<Indent1><Indent2>LogMessage
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 "<".

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.

Blubbel 30. Nov 2011 14:41

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...

Luckie 30. Nov 2011 14:48

AW: Zeichen aus einem String filtern/löschen
 
Was für ein Buffer?

Delphi-Quellcode:
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.
(Dauer 10 Minuten, inklusive starten der IDE und suchen nach einer PosEx Funktion hier im Forum.)

Die Fallunterscheidung überlasse ich dir.

Blubbel 30. Nov 2011 14:53

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^^

Luckie 30. Nov 2011 14:54

AW: Zeichen aus einem String filtern/löschen
 
Du meinst das, was ich Start und Stop genannt habe?

Blubbel 30. Nov 2011 14:59

AW: Zeichen aus einem String filtern/löschen
 
Ja genau...
Delphi-Quellcode:
Copy(LogLine, Start + 1, Stop - Start -1);
Wieso nimmst du hier start + 1 und stop-start-1? das verstehe ich nicht ganz

Luckie 30. Nov 2011 15:00

AW: Zeichen aus einem String filtern/löschen
 
Dann guck in der Hilfe nach, wie Copy funktioniert.

Sir Rufo 30. Nov 2011 16:15

AW: Zeichen aus einem String filtern/löschen
 
Wieso denn jetzt dieser Aufruf
Delphi-Quellcode:
procedure SplitLogLine(LogLine: string; out TimeStamp: string; out Indent1: string; out Indent2: string; out LogMsg: string);
Eben hatten wir noch ein Array in den Parametern?
Und es war eine Funktion?
Und was ist mit den Sternchen?
Habe ich da was nicht mitbekommen?

Luckie 30. Nov 2011 16:17

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:

Sir Rufo 30. Nov 2011 16:19

AW: Zeichen aus einem String filtern/löschen
 
Zitat:

Zitat von Luckie (Beitrag 1138638)
Das wäre meine Lösung der Aufgabe ohne Rücksicht was der Lehrer vorgibt; das war mir etwas wirr.

Wir wissen nicht, ob diese wirren Vorgaben tatsächlich so vom Lehrer kamen, sondern nur, dass diese so verstanden wurden.

Luckie 30. Nov 2011 16:21

AW: Zeichen aus einem String filtern/löschen
 
Egal, er hat Democode für das Grundproblem, den Rest kann er machen.

Blubbel 2. Dez 2011 11:56

AW: Zeichen aus einem String filtern/löschen
 
Also ich habs jetzt nur steht mir noch ein kleines Problem im wege
Delphi-Quellcode:
     
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;
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.

Danke für eure Unterstützung!!!

DeddyH 2. Dez 2011 12:00

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

Luckie 2. Dez 2011 12:02

AW: Zeichen aus einem String filtern/löschen
 
Was machst du da um Gottes Willen?

Blubbel 2. Dez 2011 12:03

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

Blubbel 2. Dez 2011 16:26

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:
      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;
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

Blubbel 2. Dez 2011 17:31

AW: Zeichen aus einem String filtern/löschen
 
Ich möchte doch bloß die werte im array in meinem Edit haben -.-

Bummi 2. Dez 2011 17:36

AW: Zeichen aus einem String filtern/löschen
 
Luckie hat doch in #14 bereits alles vorgekaut oder gar vorverdaut .....

Blubbel 2. Dez 2011 17:42

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.
Seite 1 von 2  1 2      

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