Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi strings um ein bestimmtes zeichen vermindern (https://www.delphipraxis.net/127219-strings-um-ein-bestimmtes-zeichen-vermindern.html)

Molzer 9. Jan 2009 10:30


strings um ein bestimmtes zeichen vermindern
 
wie kann man aus einem string s ein bestimmtes zeichen s[i] abziehen??

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
s:='abcdefghij' ;

s:=s-s[4];//diese zeile ergibt einen fehler
showmessage(s);

end;

fkerber 9. Jan 2009 10:32

Re: strings um ein bestimmtes zeichen vermindern
 
Hi!

Willst du quasi aus der Mitte ein Zeichen "ausschneiden"?
Ich denke, dann müsstest du quasi einen neuen String zusammenbauen aus den Zeichen, die du noch haben möchtest.
Dabei sollte dir Delphi-Referenz durchsuchencopy weiterhelfen.


Ciao, Frederic

Klaus01 9. Jan 2009 10:32

Re: strings um ein bestimmtes zeichen vermindern
 
Mit Kanonen auf Spatzen:

Delphi-Quellcode:
s:=stringReplace(s,s[4],'',[]);
Grüße
Klaus

Der.Kaktus 9. Jan 2009 10:32

Re: strings um ein bestimmtes zeichen vermindern
 
Delphi-Quellcode:
delete(s,4,1);

mkinzler 9. Jan 2009 10:33

Re: strings um ein bestimmtes zeichen vermindern
 
Meinst du das Zeiceh aus dem String entfernen?
Delete()

Molzer 9. Jan 2009 10:36

Re: strings um ein bestimmtes zeichen vermindern
 
mein problem:

jede folge von leerzeichen >1 is durch ein einzelnes leerzeichen und der anzahl der leerzeichen zu ersetzen.

das wetter ______ist...
das wetter 6ist...

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var f:textfile;
z,i,n,y:integer;
s:string;
begin
n:=0;
if opendialog1.execute then begin
assignfile(f, opendialog1.filename);
reset(f);
read(f, s);
z:=length(s);
 showmessage(inttostr(z));
for i := 1 to z do begin
//  while s[i] =char(32) do begin
  if s[i] =char(32) then
  n:=n+1;
  end;
  ;

  end;
  showmessage(s[i]);


    end;
      closefile(f);
  end;

alzaimar 9. Jan 2009 12:43

Re: strings um ein bestimmtes zeichen vermindern
 
Delphi-Quellcode:
Function ZapSpacesGeneric (Const aString : String) : String;
Var
  sPrevVersion : String;
Begin
  Result := aString;
  While Pos (' ', Result) > 0 Do // solange doppelte Leerzeichen vorhanden sind
    Result := StringReplace (Result, ' ',' ', [rfReplaceAll]) // ersetze sie durch ein Leerzeichen
End;
Eine knappe Implementierung mit Bordmitteln, die beinahe jeden Performancewettbewerb verliert, aber für den Hausgebrauch ausreichend ist. Im Prinzip werden solange alle doppelten Leerzeichen durch ein einziges Leerzeichen ersetzt, bis keine doppelten Leerzeichen mehr vorhanden sind.

Klaus01 9. Jan 2009 13:07

Re: strings um ein bestimmtes zeichen vermindern
 
Hallo,

@alzaimar
Dein Lösung zählt nicht die Anzahl der Leerzeichen wenn mehr als 1 Leerzeichen
hintereinander folgen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  j: Integer;
  s,s1: String;
begin
  s:='dies ist   ein      Test';
  s1:='';
  while pos(' ',s) > 0 do
    begin
      s1:=s1+copy(s,1,pos(' ',s));
      delete(s,1,pos(' ',s));
      if s[1] = ' ' then
        begin
          j:=2;
          while s[j] = ' ' do
            inc(j);
          delete(s,1,j-1);
          s1:=s1+IntToStr(j);
        end;
    end;
  s1:=s1+s;
  edit1.Text:=s1;
end;
Ausgabe:
dies ist 4ein 7Test

Grüße
Klaus

nahpets 9. Jan 2009 13:10

Re: strings um ein bestimmtes zeichen vermindern
 
Hallo,

Du möchtest für die Leerzeichen so 'ner Art Lauflängenkodierung.
Dashier ist mal eben so schnell dahingedaddelt und sicherlich nicht fehlerfrei, aber vielleicht hilfts ja schon mal:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var
          i  : Integer;
          k  : Integer;
          s  : String;
          ch : Char;
          sIn : String;
begin
  sIn := 'Was  steht denn   hier jetzt  an   Leerzeichen?';
  i  := 0;
  k  := -1;
  s  := '';
  for i := 1 to Length(sIn) do begin
    ch := sIn[i];
    case ch of
      ' ' : case k Of
             -1 : begin
                    s := s + ch;
                    Inc(k);
                  end;
            else
              inc(k);
            end;
    else
      case k of
        -1 : k := 0;
         0 : k := 0;
         1 : Begin
               s := s + ' ';
               k := 0;
             end;
      else
        s := s + ' ' + IntToStr(k);
        k := -1;
      end;
      s := s + ch;
    end;
  end;
  ShowMessage(sIn + #13 + s);
end;
Wenn es sich bei Deiner Datei um eine Textdatei handelt, könntest Du sie in eine Stringliste lesen und anstelle von sIn das Text-Attribut der Stringliste benutzen oder die Stringliste zeilenweise durchgehen oder auch die Textdatei zeilenweise lesen.

Und Klaus war schneller :wink:

edit: Schreibfehler korrigiert

Molzer 9. Jan 2009 13:17

Re: strings um ein bestimmtes zeichen vermindern
 
Danke für Eure Hilfe!!

WInfo 9. Jan 2009 13:18

Re: strings um ein bestimmtes zeichen vermindern
 
Moin Moin, ein Wettbewerb? Dann möcht ich auch eine Routine zum besten geben 8)
Delphi-Quellcode:
 
  FUNCTION TrimDublicateSpaces(aString: string): string;
  VAR
    i, j: integer;
  BEGIN
    SetLength(Result, length(aString));
    j := 0;
    FOR i := 1 TO length(aString) DO
      IF aString[i] <> ' ' THEN
      BEGIN
        Inc(j);
        Result[j] := aString[i];
      END
      ELSE
        IF (j = 0) or (Result[j] <> aString[i]) THEN
        BEGIN
          Inc(j);
          Result[j] := aString[i];
        END;
    SetLength(Result, j);
  END;
//Edit: SetLength nach Hinweis Sakura angepasst.

sakura 9. Jan 2009 13:21

Re: strings um ein bestimmtes zeichen vermindern
 
Zitat:

Zitat von WInfo
SetLength(Result, length(aString) * sizeof(char));

Bei SetLength ist das SizeOf(Char) falsch! SetLength arbeitet immer mit der Elementgröße (bei Strings also SizeOf(Char)). In Delphi 2009 würde Dein Result-string einfach zu lang sein.

...:cat:...

WInfo 9. Jan 2009 13:27

Re: strings um ein bestimmtes zeichen vermindern
 
Moin Moin Sakura,

das SetLength wurde nun in der Routine angepasst. Jetzt sollte die Routine i.O. sein und hoffentlich keine grosse Performancebremse.

sakura 9. Jan 2009 13:38

Re: strings um ein bestimmtes zeichen vermindern
 
Zitat:

Zitat von WInfo
das SetLength wurde nun in der Routine angepasst. Jetzt sollte die Routine i.O. sein und hoffentlich keine grosse Performancebremse.

:)

Jetzt meine Idee (ungetestet, sollte evtl. einen Tick schneller sein).
Delphi-Quellcode:
function RemoveDoubles(const str: string; const ch: Char = #32): string;
var
  I, Cnt, Len: Integer;
  CurrChar: Char;
  LastWasChar: Boolean;
begin
  Len := Length(str);
  SetLength(Result, Len);
  Cnt := 0;
  LastWasChar := False;
  for I := 1 to Len do
  begin
    CurrChar := str[I];
    if CurrChar <> ch then
    begin
      Inc(Cnt);
      Result[Cnt] := CurrChar;
      LastWasChar := False;
      continue;
    end;
    if LastWasChar then
      continue;
    Inc(Cnt);
    Result[Cnt] := CurrChar;
    LastWasChar := True;
  end;
  SetLength(Result, Cnt);
end;
Wichtig ist die CONST Deklaration für den eingehenden String, das spart ein try..finally-Block des Compilers. Des Weiteren sparen wir uns einige Array-Rechnungen durch das Cachen des aktuell zu verarbeitenden Zeichens, als auch durch das Lesen/Setzen eines Flags für den Vergleich des letzten kopierten Zeichens. Soweit mal meine Theorie. Testen kann wer anders ;)

...:cat:...

WInfo 9. Jan 2009 14:06

Re: strings um ein bestimmtes zeichen vermindern
 
Moin Moin Sakura,

hast Recht, habe auch noch das Const angefügt und das brachte 1,47% Geschwindigkeitsvorteil, Deine Routine ist dagegen noch einmal um 3,71% schneller. Das bringt also schon einiges die Werte zwischenzuspeichern, das hätte ich gar nicht gedacht.

sakura 9. Jan 2009 14:33

Re: strings um ein bestimmtes zeichen vermindern
 
Zitat:

Zitat von WInfo
Moin Moin Sakura,

hast Recht, habe auch noch das Const angefügt und das brachte 1,47% Geschwindigkeitsvorteil, Deine Routine ist dagegen noch einmal um 3,71% schneller. Das bringt also schon einiges die Werte zwischenzuspeichern, das hätte ich gar nicht gedacht.

Danke für die Auswertung :mrgreen: Jetzt stellt sich nur die Frage, wie diese Methode eingesetzt werden soll. Selten in einer GUI Anwendung - wenn interessieren da selbst 100% bei einer Methode, welche i.A. in wenigen Millisekunden ausgeführt wird. Oder richtig hart auf einem Webserver mit tausenden von Anwendern, dann wird es richtig interessant :zwinker:

...:cat:...

alzaimar 9. Jan 2009 15:28

Re: strings um ein bestimmtes zeichen vermindern
 
Zitat:

Zitat von Klaus01
@alzaimar
Dein Lösung zählt nicht die Anzahl der Leerzeichen wenn mehr als 1 Leerzeichen
hintereinander folgen.

Absolut korrekt. Wer lesen kann, ist klar im Vorteil. :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 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