![]() |
Zeichen in Textdatei ersetzen
Das ist mein Code:
Delphi-Quellcode:
Leider werden die Zeichen nicht ersetzt, sondern es wird alles geloescht.
function file2string(filename:string):string;
var f: file of char; c:char; begin result := ''; if fileexists(filename) then begin assignfile(f,filename); reset(f); while not eof(f) do begin read (f,c); result := result + c; end; closefile(f); end; end; function strreplace(s,what, whit:string; var count:integer):string; var lastfound: integer; begin count := 0; result := s; if (what = '') or (whit = '') then exit; lastfound := 0; while pos(uppercase(what), uppercase(copy(result,lastfound+1,length(result)))) > 0 do begin inc(count); lastfound := lastfound + pos(uppercase(what), uppercase(copy(result,lastfound+1,length(result)))); result := copy(result,1,lastfound-1) + whit + copy(result,lastfound + length(what),length(result)); lastfound := lastfound - (length(what)-length(whit)); end; end; function string2file(filename, aString: string; appendmode:boolean):boolean; var f: textfile;//file of char; i : integer; begin assignfile(f,filename); if appendmode then append(f) else rewrite(f); for i := 1 to length(aString) do write(f,astring[i]); closefile(f); result := true; end; procedure TForm1.okButtonClick(Sender: TObject); var dateiname: string; mystring: string; c: integer; begin dateiname := 'gbuch.txt'; mystring := strreplace(mystring,'@','[at]',c); string2file('gbuch.txt', myString, false); showmessage('es wurden ' + inttostr(c) + ' einträge ersetzt'); //IdFTP1.Put(dateiname, dateiname); end; Kann mir jemand helfen? |
Re: Zeichen in Textdatei ersetzen
Nabend!
1. Du rufst gar nicht File2String auf, is das normal :gruebel: 2. Es gibt schon eine vorgefertigte StringReplace-Funktion, oder muss es eine spezielle sein? //Edit: Ausserdem kannst du dir doch nicht so sicher sein, ob wirklich c mal das @ ersetzt wurde, weil es doch auch weniger als c mal vorkommen könnte, oder? |
Re: Zeichen in Textdatei ersetzen
wenn du direkt in der datei ersetzen willst, brauchst du seek() (oder wie es hier heisst) und read/write funktionen. wenn deine datei gross ist, ist das die beste loesung.
|
Re: Zeichen in Textdatei ersetzen
Read und Write funktioniert aber nur mit typisierten Dateien :warn:
|
Re: Zeichen in Textdatei ersetzen
deine file2string kann mana uch einfacher realisieren:
Delphi-Quellcode:
das ist jetzt so aius dem Kopf ungetestet runterschrieben, ich denke aber mal, dass das was schneller geht, weil der die Datei an einem Stück liest und in den resutl dtring wirft. Die setlength-Methode ist nämlich ziemlich langsam und wenn du zwei strings addierst, muss der jedes mal setlength ausführen und das für jedes Zeichen...
function file2string(const filename: TFileName):string;
var datei: TFileStream; begin datei :=TFileStream.Create(filename, fmOpenRead); datei.Read(result, datei.size); datei.Free; end; Zitat:
|
Re: Zeichen in Textdatei ersetzen
Code:
Der Grund, warum die Datei gelöscht wird:
function file2string(filename:string):string;
var f: file of char; begin result := ''; if fileexists(filename) then begin assignfile(f,filename); reset(f); [color=#ff0000]SetLength(Result, FileSize(f)); BlockRead(f, Result, FileSize(f));[/color] closefile(f); end; end; function strreplace(s,what, whit:string; var count:integer):string; var lastfound: integer; begin count := 0; result := s; if (what = '') or (whit = '') then exit; lastfound := 0; [color=#ff0000]what := uppercase(what);[/color] while [color=#ff0000]PosEx(what, uppercase(result), lastfound[/color]) > 0 do begin inc(count); lastfound := lastfound + pos(what, uppercase(copy(result,lastfound+1,length(result)))); result := copy(result,1,lastfound-1) + whit + copy(result,lastfound + length(what),length(result)); lastfound := lastfound - (length(what)-length(whit)); end; end; function string2file(filename, aString: string; appendmode:boolean):boolean; var f: textfile;//file of char; begin assignfile(f,filename); if appendmode then append(f) else rewrite(f); [color=#ff0000]Write(f, aString);//BlockWrite(f, aString, Length(aString));[/color] closefile(f); result := true; end; procedure TForm1.okButtonClick(Sender: TObject); var dateiname: string; mystring: string; c: integer; begin dateiname := 'gbuch.txt'; [color=#ff0000]myString := file2string('gbuch.txt');[/color] [color=#ff00ff]<< die Datei muß natürlich auch eingelesen werden[/color] mystring := strreplace(mystring,'@','[at]',c); string2file('gbuch.txt', myString, false); showmessage('es wurden ' + inttostr(c) + ' einträge ersetzt'); //IdFTP1.Put(dateiname, dateiname); end; okButtonClick > Datei nicht eingelesen Tempo: Den Grund hat yankee schon gesagt ... zeichenweises Einlesen ist nicht gerade schnell. Aber nicht unbedingt bei jedem Zeichen ... der MemoryManager von Delphi ändert den Speicher nur alle etwa 4 Zichen. :mrgreen: uppercase(what): Wozu denn jedesmal von Neuem umwandeln ... einmal reicht auch :zwinker: Pos > PosEx: PosEx sucht nur noch aber der letzten Fundstelle, wärend Pos immer wieder den gesamten String durchsucht. Also braucht man nicht erst einen Teilstring kopieren und jedesmal dafür Speicher reservieren und freigeben. Das strreplace kann man auch einfacher machen, wobei aber der Vorteil von PosEx verloren geht:
Delphi-Quellcode:
function strreplace(s,what, whit:string; var count:integer):string;
begin count := 0; result := s; if (what = '') or (whit = '') then exit; what := uppercase(what); while Pos(what, uppercase(result)) > 0 do begin inc(count); Result := StringReplace(Result, what, whit, [rfIgnoreCase]); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 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 by Thomas Breitkreuz