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/)
-   -   String-Bearbeitung! Ich finde den Fehler nicht! (https://www.delphipraxis.net/75941-string-bearbeitung-ich-finde-den-fehler-nicht.html)

SirRobert 27. Aug 2006 15:35


String-Bearbeitung! Ich finde den Fehler nicht!
 
Hallo zusammen,

ich habe folgendes Problem:
ich möchte aus einem langen String alle alleinstehenden #$A entfernen.
Hierzu habe ich mir folgende Prozedur gebastelt:
Delphi-Quellcode:
procedure Delete10(var Str : string);
var
        MyStr, TempStr                 : string;
        iPos                           : integer;
begin
        MyStr := '';
        TempStr := str;
        iPos := Pos(#$A, TempStr);
        while iPos > 0 do
        begin
                if iPos > 1 then
                begin
                        if TempStr[iPos - 1] <> #$D then
                        begin
                                MyStr := MyStr + Copy(TempStr, 1, iPos - 1);
                        end
                        else
                                MyStr := MyStr + Copy(TempStr, 1, iPos);
                        TempStr := Copy(TempStr, iPos + 1 , Length(TempStr) - (iPos + 1));
                end
                else
                begin
                        MyStr := MyStr + Copy(TempStr, 2, Length(TempStr));
                        TempStr := Copy(TempStr, 2 , Length(TempStr) - (2));
                end;
                iPos := Pos(#$A, TempStr);
        end;
        Str := MyStr+TempStr;
end;
Jetzt habe ich festgestellt, dass die Prozedur bei längeren Strings
(> 100.000 Zeichen) einfach irgendwo abbricht, und so einen nicht vollständigen
String zurückliefert. Es wird zwar für gleiche Strings immer gleich abgeschnitten,
aber WARUM ÜBERHAUPT??? Wo steckt mein der Fehler????

Ich danke Euch für Eure Hilfe!

Grüße

Robert

CK_CK 27. Aug 2006 15:38

Re: String-Bearbeitung! Ich finde den Fehler nicht!
 
Warum machstdu das nicht mit StringReplace?

Delphi-Quellcode:
Result := StringReplace(TestString,' '+#$A+' ','',[rfReplaceAll]);
So müsste das klappen...

SirRobert 27. Aug 2006 15:40

Re: String-Bearbeitung! Ich finde den Fehler nicht!
 
Hi,

das stimmt, aber in dem String befinden sich auch: #$D#$A 's
Die will ich ausschließen und nicht entfernen!

CK_CK 27. Aug 2006 15:42

Re: String-Bearbeitung! Ich finde den Fehler nicht!
 
deswegen hab ich ja davor und danach ein Leerzeichen angefügt (' ')

mkinzler 27. Aug 2006 15:42

Re: String-Bearbeitung! Ich finde den Fehler nicht!
 
Was meinst du mit ausschließen?

Balu der Bär 27. Aug 2006 15:43

Re: String-Bearbeitung! Ich finde den Fehler nicht!
 
Zitat:

Zitat von mkinzler
Was meinst du mit ausschließen?

Die sollen von dem Ersetzen ausgeschlossen werden, also unverändert bleiben. :stupid:

SirRobert 27. Aug 2006 15:46

Re: String-Bearbeitung! Ich finde den Fehler nicht!
 
Hi Hi!

Mit ausschließen meine ich:

wenn ein #$A gefunden, und davor ein #$D steht, so suche weitere #$A !

DGL-luke 27. Aug 2006 15:47

Re: String-Bearbeitung! Ich finde den Fehler nicht!
 
hmm...

Delphi-Quellcode:
function stripsingle(s: string; notifbefore,c,notifafter: char): string;
var i,si,sc: Integer; //index, stringindex, stripcount
begin
setlength(Result,length(s))
si := 1;

if (s[1] <> c) or (s[2] = notifafter) then
  begin
    Result[si] := s[1];
    Inc(si);
  end;

for i := 2 to length(s)-1 do
  if ((s[i] = c) and ((s[i+1] = notifafter) or (s[i-1] = notifbefore))) or (s[i] <> c)then
    begin
      Result[si] := s[i];
      Inc(si);
    end
  else
    Inc(sc);
 
if (s[length(s)] <> c) or (s[length(s)-1] = notifbefore) then
  begin
  Result[si] := s[length(s)];
  Inc(si);

setlength(Result,si); //hoffe das löscht den string nicht....
end;
warum ist meine Funktion so viel kürzer als deine? aufrufen mit

Delphi-Quellcode:
text := stripsingle(text,#13,#10,#0);
Ach ja: performant ist die funktion keineswegs. man sollte lieber einen speicherbereich von der größe des ursprungsstrings belegen, dann die einzelnen chars zuweisen und zum schluss runterkürzen.

EDIT: habs nochmal angepasst...
EDIT: jetzt isses wahrscheinlich auch performant. werds aber mal testen.
EDIT: möp. funzt nicht. werds mal austesten....

Jürgen Thomas 27. Aug 2006 15:48

Re: String-Bearbeitung! Ich finde den Fehler nicht!
 
Zitat:

Zitat von SirRobert
das stimmt, aber in dem String befinden sich auch: #$D#$A 's
Die will ich ausschließen und nicht entfernen!

@CK_CK
Ich befürchte, dass nach den Leerzeichen nicht geprüft werden darf...

Ob es schneller geht, weiß ich nicht (ausprobieren), aber möglich ist folgendes Verfahren:
Delphi-Quellcode:
const sCRLF = 'ABRAkadaBRA1279${]'; //  also irgendwelcher Schrott
sTemp := StringReplace(TestString, #$D#$A, sCRLF, [rfReplaceAll]);
sTemp := StringReplace(sTemp,     #$A,   '',   [rfReplaceAll]);
Result := StringReplace(sTemp,     sCRLF, #$D#$A,[rfReplaceAll]);
Gruß Jürgen

Hawkeye219 27. Aug 2006 15:50

Re: String-Bearbeitung! Ich finde den Fehler nicht!
 
Hallo Robert,

zwei Fehler stecken in den Zuweisungen zu TempStr im Schleifenkörper. In beiden Fällen wird das letzte Zeichen des Strings abgeschnitten. Ersetze einfach den dritten Parameter für die Copy-Funktion durch den Wert MaxInt.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 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-2025 by Thomas Breitkreuz