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/)
-   -   C# StringReplace automatisch - was geht schnell und einfach? (https://www.delphipraxis.net/76702-stringreplace-automatisch-geht-schnell-und-einfach.html)

Jürgen Thomas 8. Sep 2006 13:02


StringReplace automatisch - was geht schnell und einfach?
 
Hallo,

ich möchte in einer Textdatei eine Reihe von Textteilen ersetzen, z.B.:
Zitat:


1. Satz: ohne Satzbez.
Akademie für alte Musik Berlin
</td>
<td><span class="strong">3'40</span>
</td>
Suche und ersetzen: &auml; durch ä / &ouml; durch ö / &uuml; durch ü usw. Ich habe also zwei konstante Arrays arrSearch und arrReplace, die 'durch' die Textdatei laufen sollen. Welches Verfahren ist dafür das schnellste und einfachste?
  • als String einlesen (für FileStream ist die Dateigröße bekannt) und in einer Schleife für jedes Element von arrSearch/arrReplace bearbeiten, dann den String wieder als Textdatei speichern
  • analog, aber mit RegEx arbeiten (ich habe noch keine Ahnung von RegEx, weiß aber, dass damit Suchen/Ersetzen möglich ist, und muss mich sowieso damit befassen)
  • Oder habt Ihr bessere Vorschläge?
Achtung: Ich habe jetzt nur die Delphi-Begriffe verwendet, werde aber mit C# oder #D unter NET arbeiten! Die Texte sind Schnipsel, die aus HTML-Dateien kommen, aber keine richtigen HTML-Daten!

Danke für Eure Hilfe! Jürgen

marabu 8. Sep 2006 13:46

Re: StringReplace automatisch - was geht schnell und einfach
 
Hallo Jürgen,

Zitat:

Die Texte sind Schnipsel, die aus HTML-Dateien kommen, aber keine richtigen HTML-Daten!
das macht mich jetzt aber stutzig, da deine anderen threads zum Thema den Eindruck vermitteln, als wären es durchaus von einem HTTP-Server servierte HTML-Dateien.

Grüße vom marabu

r2c2 8. Sep 2006 14:02

Re: StringReplace automatisch - was geht schnell und einfach
 
Die erstere Methode is IMHO zu bevorzugen. RegEx geht zwar auch, is aber dafür, dass du nur feste Strings durch andere feste Strings ersetzen willst, oversized und dadurch langsamer...

mfg

Christian

Jürgen Thomas 7. Okt 2006 11:25

Re: StringReplace automatisch - was geht schnell und einfach
 
Schlussbericht

Ich benutze jetzt tatsächlich String.Replace() mit einem Replace-Array wie folgt:
Code:
StringBuilder Text_Gesamt = new StringBuilder(500000);
//  die genaue Länge kann durch FileInfo vorher bestimmt werden
//  Dateien einlesen durch etwas wie Text_Gesamt.AppendText( File.ReadAllText )
string[] arrReplace = new string[] {
//  Liste übernommen aus: [url]http://de.selfhtml.org/html/referenz/zeichen.htm[/url]
//  Zeichen für Griechisch, Interpunktion, Technik u.ä. habe ich weggelassen
   "", " ",                      
   "&quot;", "\"",
   "&Ccedil;", "Ç",
   "&Egrave;", "È",
//  usw. etwa 120 Paare: zuerst der OldString, dann der NewString
//  (der nicht nur aus einzelnen Zeichen, sondern auch aus Strings bestehen kann)
   "



", "

" };                                    
//  alle Konvertierungen in einem Rutsch:                  
for (int x1 = 0; x1 < arrReplace.Length; x1 += 2 )
   Text_Gesamt.Replace(arrReplace[x1], arrReplace[x1+1]);
Text_Gesamt entsteht durch Einlesen von etwa 100 Textdateien. Obwohl NET Strings als feste Größe behandelt und bei StringBuilder.Replace() ständig im Arbeitsspeicher umkopieren muss, dauert dieser Vorgang mit 120x Suchen/Ersetzen in 400 kB weniger als 1 Sekunde - für einen Arbeitsablauf, der noch viele weitere Prüfungen benötigt, ist das zu vernachlässigen.

Das zur Kenntnis für andere, die ähnliche Verfahren benötigen. Gruß Jürgen


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