![]() |
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:
Jetzt habe ich festgestellt, dass die Prozedur bei längeren Strings
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; (> 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 |
Re: String-Bearbeitung! Ich finde den Fehler nicht!
Warum machstdu das nicht mit StringReplace?
Delphi-Quellcode:
So müsste das klappen...
Result := StringReplace(TestString,' '+#$A+' ','',[rfReplaceAll]);
|
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! |
Re: String-Bearbeitung! Ich finde den Fehler nicht!
deswegen hab ich ja davor und danach ein Leerzeichen angefügt (' ')
|
Re: String-Bearbeitung! Ich finde den Fehler nicht!
Was meinst du mit ausschließen?
|
Re: String-Bearbeitung! Ich finde den Fehler nicht!
Zitat:
|
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 ! |
Re: String-Bearbeitung! Ich finde den Fehler nicht!
hmm...
Delphi-Quellcode:
warum ist meine Funktion so viel kürzer als deine? aufrufen mit
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;
Delphi-Quellcode:
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.
text := stripsingle(text,#13,#10,#0);
EDIT: habs nochmal angepasst... EDIT: jetzt isses wahrscheinlich auch performant. werds aber mal testen. EDIT: möp. funzt nicht. werds mal austesten.... |
Re: String-Bearbeitung! Ich finde den Fehler nicht!
Zitat:
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:
Gruß Jürgen
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]); |
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. |
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