AGB  ·  Datenschutz  ·  Impressum  







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

Zeichen in Textdatei ersetzen

Ein Thema von japetos · begonnen am 17. Okt 2005 · letzter Beitrag vom 18. Okt 2005
Antwort Antwort
japetos

Registriert seit: 30. Aug 2005
Ort: Montreal
58 Beiträge
 
#1

Zeichen in Textdatei ersetzen

  Alt 17. Okt 2005, 21:27
Das ist mein Code:

Delphi-Quellcode:
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;
Leider werden die Zeichen nicht ersetzt, sondern es wird alles geloescht.
Kann mir jemand helfen?
  Mit Zitat antworten Zitat
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#2

Re: Zeichen in Textdatei ersetzen

  Alt 17. Okt 2005, 21:39
Nabend!

1. Du rufst gar nicht File2String auf, is das normal
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?
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
ripper8472

Registriert seit: 17. Aug 2003
275 Beiträge
 
#3

Re: Zeichen in Textdatei ersetzen

  Alt 17. Okt 2005, 21:49
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.
Christoph
  Mit Zitat antworten Zitat
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#4

Re: Zeichen in Textdatei ersetzen

  Alt 17. Okt 2005, 21:52
Read und Write funktioniert aber nur mit typisierten Dateien
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#5

Re: Zeichen in Textdatei ersetzen

  Alt 18. Okt 2005, 01:22
deine file2string kann mana uch einfacher realisieren:
Delphi-Quellcode:
function file2string(const filename: TFileName):string;
var datei: TFileStream;
begin
    datei :=TFileStream.Create(filename, fmOpenRead);
    datei.Read(result, datei.size);
    datei.Free;
end;
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...
Zitat von japetos:
Delphi-Quellcode:
for i := 1 to length(aString) do
     write(f,astring[i]);
Also warum machst du nicht einfach write(astring) statt diese forschleife?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.182 Beiträge
 
Delphi 12 Athens
 
#6

Re: Zeichen in Textdatei ersetzen

  Alt 18. Okt 2005, 02:52
Code:
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;
Der Grund, warum die Datei gelöscht wird:
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.


uppercase(what):
Wozu denn jedesmal von Neuem umwandeln ... einmal reicht auch


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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:56 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