Delphi-PRAXiS

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

SirRobert 27. Aug 2006 16:01

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

Mensch, das ging ja flott! Klasse! :hello:

Der Fehler war tatsächlich die Zuweisung!
Danke Hawkeye... aber natürlich auch an alle anderen!!!

Schönen Sonntag noch!!

Robert

DGL-luke 27. Aug 2006 16:11

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

hier mein Code nochmal:

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 length(s) = 1 then
  begin
    if s[1] = c then
      Result := ''
    else
      Result := s;
    Exit;
  end;

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

if length(s) > 2 then
  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);

//Behandlung des Endes
if length(s) > 2 then
  if (s[length(s)] <> c) or (s[length(s)-1] = notifbefore) then
    begin
      Result[si] := s[length(s)];
      Inc(si);
    end;

setlength(Result,si); //hoffe das löscht den string nicht....
end;
scheint mir schöner als deiner, werd mir den aber gleich nochmal ansehen. ;)

SirRobert 27. Aug 2006 16:23

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

ich danke Dir!
Es gibt natürlich mehrere Lösungsmöglichkeiten, doch ich
habe nicht verstanden, warum meine nicht funktioniert! HARGH!

Und siehe da, an einer Stelle etwas mehr als nötig subtrahiert,
und schon läuft's nicht so wie man es wollte/dachte!

CU

Robert


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