AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

StringReplace und seine Tücken

Ein Thema von Catbytes · begonnen am 7. Dez 2005 · letzter Beitrag vom 8. Dez 2005
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#21

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 10:55
Zitat von GuenterS:
Ich stell mir das so vor:

Du gehst Dein Memo zeichen für Zeichen durch und schreibst das konvertierte in die neue Stringlist, dann ist es ziemlich egal, welche Reihenfolge du verwendest.
Hmmmmm - an die Möglichkeit habe ich noch gar nicht gedacht.

Delphi-Quellcode:
function GetISO8859_1(s: string): string;
var
  i: Integer;
  sNew: string;
begin
  sNew := '';
  for i := 1 to Length(s) do
  begin
    case s[i] of
      ';': sNew := sNew + '& # 5 9 ;';
      '#': sNew := sNew + '& # 3 5 ;';
      '&': sNew := sNew + '& # 3 8 ;';
      'ä': sNew := sNew + '& # 2 2 8 ;';
      // Hier folgen weitere ISO-Codes...
    else
      sNew := sNew + s[i];
    end;
  end;
  Result := sNew;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  Memo1.Clear;
  Memo1.Lines.Add('Mustermann GmbH & Co. KG');
  Memo1.Lines.Add('');
  Memo1.Lines.Add('Täler, Wälder; all das # ist Natur & schön.');
  Memo2.Clear;
  for i := 0 to (Memo1.Lines.Count - 1) do
  begin
    Memo2.Lines.Add(GetISO8859_1(Memo1.Lines[i]));
  end;
end;
Ergibt:

Mustermann GmbH & # 3 8 ; Co. KG

T& # 2 2 8 ;ler, W& # 2 2 8 ;lder& # 5 9 ; all das & # 3 5 ; ist Natur & # 3 8 ; schön.



Danke euch allen...

Werde die komplette Function dann hier noch posten, wenn ich alles abgeschrieben habe.

Entdeckt noch jemand einen (logischen) Fehler oben im Code? Kann man an irgend einer Stelle Code einsparen oder verbessern?
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#22

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 10:57
Es gibt einen "Fehler" ... Du wirst im Memo2 nur 1 Zeichen bzw. den Code für das Konvertierte Zeichen in einer Zeile haben.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#23

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 11:01
Zitat von GuenterS:
Es gibt einen "Fehler" ... Du wirst im Memo2 nur 1 Zeichen bzw. den Code für das Konvertierte Zeichen in einer Zeile haben.
Den Satz verstehe ich nicht.

In Memo2 kam genau das gleiche raus, wie in Memo1 - nur eben übersetzt. Mit Umbrüchen und allem...

Was genau meinst Du?
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#24

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 11:04
Die Lines Property vom Memo ist ja eigentlich auch nur ein TStrings Typ. Wenn Du da für jedes Zeichen Add aufrufst hast Du es nachher nicht mehr so drinnen wie du es im Ursprünglichen Memo hast, auch wenn es ein Memo vielleicht anders darstellt.


versuch doch mal nach der Konvertiertung den Inhalt von Memo2 zeilenweise in eine Datei zu schreiben, dann dürftest Du schön sehen was ich meine.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#25

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 11:11
Zitat von GuenterS:
Die Lines Property vom Memo ist ja eigentlich auch nur ein TStrings Typ. Wenn Du da für jedes Zeichen Add aufrufst hast Du es nachher nicht mehr so drinnen wie du es im Ursprünglichen Memo hast, auch wenn es ein Memo vielleicht anders darstellt.


versuch doch mal nach der Konvertiertung den Inhalt von Memo2 zeilenweise in eine Datei zu schreiben, dann dürftest Du schön sehen was ich meine.
Hmmmmm - ich setze doch das Add nicht für jedes Zeichen, sondern für jede Zeile.

Habe es mal spaßhalber per SaveDialog und Memo2.Lines.SavetoFile gespeichert. Alles sauber...

Wenn ich es jetzt immer noch nicht verstanden habe

Hättest du zwei oder drei Zeilen Code für mich, was genau Du meinst?
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#26

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 11:13
Ich zieh meinen Kommentar zurück, hab mich verschaut. Dachte gesehen zu haben, dass du es zeichenweise in die Konvertierungsroutine schickst...
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#27

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 11:16
Zitat von GuenterS:
Ich zieh meinen Kommentar zurück, hab mich verschaut. Dachte gesehen zu haben, dass du es zeichenweise in die Konvertierungsroutine schickst...
Okay

Danke Dir trotzdem für die Hilfe!

Catbytes
  Mit Zitat antworten Zitat
Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#28

Re: StringReplace und seine Tücken

  Alt 8. Dez 2005, 09:28
Hallo Catbytes!

Bei solchen Problemen ist es eine gute Idee, das "kritische" Zeichen (hier '&') bei den Ersetzungen durch ein garantiert nicht im String vorkommendes Zeichen (z.B. #02) zu ersetzen. Dann kommt kein '&' in den Text, das nicht umgesetzt werden muß. Als letzte Aktion ersetzt Du dann das Hilfszeichen durch das '&'.

Ansonsten geht nur der Weg, den Text zeichenweise durchzugehen. Dazu sollte man den String zweimal durchgehen: erst ermittelt und summiert man für jedes Zeichen die Länge im Ergebnis, setzt dann den Ausgabestring auf diese Summe und kopiert zeichenweise das Zeichen bzw. den Ersatzstring.
Bitte nicht den Ergebnisstring durch Verketten erzeugen - die ständige Umkopiererei frißt gewaltig Speicher.

Gruß

Dietmar Brüggendiek
Dietmar Brüggendiek
Die 6 Probleme des Programmierers: 1. dauert das länger, als man 2. glaubt, 3. geht das nicht so, wie man sich das 4. schlau überlegt hat, und 5. sitzt der Fehler da, wo man ihn 6. zuletzt sucht
  Mit Zitat antworten Zitat
Phistev
(Gast)

n/a Beiträge
 
#29

Re: StringReplace und seine Tücken

  Alt 8. Dez 2005, 10:20
Zitat von Brüggendiek:
Hallo Catbytes!

Bei solchen Problemen ist es eine gute Idee, das "kritische" Zeichen (hier '&') bei den Ersetzungen durch ein garantiert nicht im String vorkommendes Zeichen (z.B. #02) zu ersetzen. Dann kommt kein '&' in den Text, das nicht umgesetzt werden muß. Als letzte Aktion ersetzt Du dann das Hilfszeichen durch das '&'.

Ansonsten geht nur der Weg, den Text zeichenweise durchzugehen. Dazu sollte man den String zweimal durchgehen: erst ermittelt und summiert man für jedes Zeichen die Länge im Ergebnis, setzt dann den Ausgabestring auf diese Summe und kopiert zeichenweise das Zeichen bzw. den Ersatzstring.
Bitte nicht den Ergebnisstring durch Verketten erzeugen - die ständige Umkopiererei frißt gewaltig Speicher.

Gruß

Dietmar Brüggendiek
Man kann auch StringReplace verwenden. Am Ende muss man einfach nur memo2.lines.text := StringReplace(memo1.lines.text,'& # 3 8 & # 5 9 ;','& # 3 8 ;',[rfReplaceAll]); oder eine (oder mehrere) ähnliche Zeile(n) benutzen, also die falschen Kombinationen wieder ersetzen. (Leerzeichen wie gehabt)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#30

Re: StringReplace und seine Tücken

  Alt 8. Dez 2005, 11:20
Moin Phistev,

Zitat von Phistev:
Man kann auch StringReplace verwenden. Am Ende muss man einfach nur memo2.lines.text := StringReplace(memo1.lines.text,'& # 3 8 & # 5 9 ;','& # 3 8 ;',[rfReplaceAll]); oder eine (oder mehrere) ähnliche Zeile(n) benutzen, also die falschen Kombinationen wieder ersetzen. (Leerzeichen wie gehabt)
wobei man allerdings tunlichst darauf verzichten sollte die Eigenschaft Memo1.Lines.Text mehrfach hintereinander zu verwenden.
Besser ist es sie einmal in eine Stringvariable zu übernehmen, dann mit dieser zu arbeiten, und anschliessend wieder in Memo1.Lines.Text zurückzuschreiben (so wie Catbytes dass auch gemacht hat).
Grund:
Beim jedem Lesen der Eigenschaft, wird Text aus den einzelnen Lines zusammengesetzt, beim Schreiben werden die Lines jeweils neu erzeugt.
Das drückt, je nach Textlänge, reichlich auf die Performance.

@Dietmar:
Als Kompromiss für die Errechnung der Buffergrösse, die ja auch Zeit in Anspruch nimmt, könnte man auch einen Schätzwert für die erforderliche Grösse annehmen (Basis wieviele Zeichen müssen durchschnittlich ersetzt werden), und beim Überschreiten dieses Wertes den Buffer um einen festgelegten Wert erhöhen (in der Hoffnung, dass das nicht notwendig sein sollte)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz