![]() |
Datei laden, speichern -> ergibt nicht die gleiche Datei
Eigentlich möchte ich ein kleines Tool programmieren, welches Umlaute in einer HTML-Datei ersetzt. Dazu habe ich folgendermaßen angefangen... und das mal getestet.
Delphi-Quellcode:
Wenn ich eine Datei da durchjage, kommt nur leider nicht die gleiche Datei hinten wieder heraus. Die Dateigröße ist minimal anders und die MD5 Prüfsumme passt auch nicht.
procedure UmlauteErsetzen(FileName: String);
var source, target: system.text; s: string; begin {$i-} Assignfile(source,FileName); Reset(source); if IOResult=0 then begin Assignfile(target,FileName+'neu'); Rewrite(target); if IOResult=0 then begin while not eof(source) do begin readln(source,s); //Umlaute ersetzen (fehlt noch) writeln(target,s); end; closefile(source); end else MessageDlg('Konnte nicht speichern.', mtError, [mbOK],0); closefile(target); end else MessageDlg('Konnte Datei ('+FileName+') nicht öffnen.', mtError, [mbOK],0); {$i+} //Datei ersetzen (fehlt noch) end; Woran liegt das? Wie kann ich das ändern? Gruß Ben |
Re: Datei laden, speichern -> ergibt nicht die gleiche Da
System.Text? Was ist denn das? Warum nicht TextFile?
Und ich denke mal, dass die letzte Zeile bei source kein abschließendes #13#10 hat, mit writeln in target das aber geschrieben wird. Das dürften dann 2 Byte Unterschied sein. |
Re: Datei laden, speichern -> ergibt nicht die gleiche Da
Danke
TextFile -> Weiß auch nicht woher ich system.text habe. Ist geändert. Ich habe da noch ne Frage zum Ersetzen... Soll ich
Delphi-Quellcode:
(
function ErsetzeUmlaute(s: string): string;
var i: integer; begin for i := 1 to length(s) do begin Case s[i] of 'ä': result := result+'ae'; 'ü': result := result+'ue'; 'ö': result := result+'oe'; 'ß': result := resultü'ss'; else: result := resultüs[i]; end; end; end; ![]() Ben |
Re: Datei laden, speichern -> ergibt nicht die gleiche Da
Hmm, ich wär sowieso anders rangegangen:
Delphi-Quellcode:
stringReplace ist nicht sonderlich performant, und eine Schleife in der Art wie du sie hast hat den Vorteil, dass sie nur einmal den Text durchgeht. Ich hätte trotzdem obiges genommen, da bei Dateien in der Größe von durchschnittlichen html-Seiten das Ganze auf halbwegs modernen Rechnern trotzdem nicht all zu lang dauern sollte.
function umlauteErsetzten(FileName: string) : Integer;
var sl : TStringList; begin result := -1; //erstmal unbekannter Fehler: sl := TStringList.Create; try if FileExists(FileName) then begin sl.LoadFromFile(FileName); sl.Text := stringReplace(sl.Text, 'ä', 'ae', [rfReplaceAll]); sl.Text := stringReplace(sl.Text, 'ö', 'oe', [rfReplaceAll]); sl.Text := stringReplace(sl.Text, 'ü', 'ue', [rfReplaceAll]); sl.Text := stringReplace(sl.Text, 'Ä', 'Ae', [rfReplaceAll]); sl.Text := stringReplace(sl.Text, 'Ö', 'Oe', [rfReplaceAll]); sl.Text := stringReplace(sl.Text, 'Ü', 'Ue', [rfReplaceAll]); sl.Text := stringReplace(sl.Text, 'ß', 'ss', [rfReplaceAll]); sl.SaveToFile(FileName); result := 0; //Alle Vorgänge erfolgreich abgeschlossen; end else result := -2; //Datei existiert nicht finally FreeAndNil(sl); end; end; Solltest du aber doch auf den von dir genannten Algo setzen, sollten Steurzeichen wie CR+LF eigentlich kein Problem darstellen, da du diese ja nicht behandelst und nicht den vorhandenen String bearbeitest, sondern einen neuen zusammensetzt. Allerdings ist da noch ein kleiner Bock drin, so wäre es richtig:
Delphi-Quellcode:
Und dann natürlich noch auf Groß-/Kleinschreibung achten ;-)
function ErsetzeUmlaute(s: string): string;
var i: integer; begin for i := 1 to length(s) do begin Case s[i] of 'ä': result := result + 'ae'; 'ü': result := result + 'ue'; 'ö': result := result + 'oe'; 'ß': result := result + 'ss'; else: result := result + s[i]; end; end; end; |
Re: Datei laden, speichern -> ergibt nicht die gleiche Da
Hallo,
in meiner Frage [dp]StringReplace automatisch - was geht schnell und einfach?[/dp] wurde Folgendes empfohlen:
|
Re: Datei laden, speichern -> ergibt nicht die gleiche Da
@Thanatos81:
So hatte ich mir das zuerst auch ungefähr überlegt. Dabei ist mir dann aber beim Ausprobieren aufgefallen, dass Unix-Zeilenumbruch dabei in Windows-Zeilenumbrüche umgewandelt werden und das wollte ich eigentlich vermeiden. Kann mir jemand sagen, ob es irgendwo probleme geben könnte mit Windows-Umbrüchen. Die zweite Variante: Ja, ich habe gesehen, dass da ein paar Fehler drin sind, ich hatte den Code nur per Copy+Paste... Sorry, ich hätte ihn verbessern sollen. Ben |
Re: Datei laden, speichern -> ergibt nicht die gleiche Da
Wäre es nicht besser, die Umlaute mit Entitäten zu maskieren? Also ü statt ü?
|
Re: Datei laden, speichern -> ergibt nicht die gleiche Da
Ja, kommt daher, dass ich Copy+Paste... Deshalb habe ich auch "... in abgewandelter Versio ..." geschrieben.
Kann mir jemand sagen, ob es irgendwo probleme geben könnte mit Windows-Umbrüchen. |
Re: Datei laden, speichern -> ergibt nicht die gleiche Da
Moin Thanatos,
man sollte sehr sparsam mit den Zugriffen auf TStrings.Text umgehen. Bei der von Dir gezeigten Verwendung sollte man mit einer (String)Zwischenvariablen arbeiten, da bei jedem Zugriff auf die Text diese Eigenschaft erst aus den einzelnen Zeilen zusammengebaut (Lesen) bzw. in die einzelnen Zeilen aufgeteilt (schreiben) werden muss. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 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