Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei laden, speichern -> ergibt nicht die gleiche Datei ?? (https://www.delphipraxis.net/76815-datei-laden-speichern-ergibt-nicht-die-gleiche-datei.html)

benst 10. Sep 2006 14:07


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:
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;
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.
Woran liegt das? Wie kann ich das ändern?
Gruß
Ben

3_of_8 10. Sep 2006 14:15

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.

benst 10. Sep 2006 14:59

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;
(http://www.delphipraxis.net/topic91915_...) in abgewandelter Version verwenden oder mehrmals mit StringReplace arbeiten? Eigenlich würde ich ja ersteres nehmen, aber gibt ja auch "Zeichen", die aus zwei Zeichen bestehen. Macht man die damit "kaputt" (z.B. #13#10)? Geht das auch alles gut, wenn Unix-Umbrüche in der HTML sind?
Ben

Thanatos81 10. Sep 2006 15:42

Re: Datei laden, speichern -> ergibt nicht die gleiche Da
 
Hmm, ich wär sowieso anders rangegangen:
Delphi-Quellcode:
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;
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.

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:
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;
Und dann natürlich noch auf Groß-/Kleinschreibung achten ;-)

Jürgen Thomas 10. Sep 2006 15:46

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:
  • in (konstanten oder variablen) Arrays arrSearch und arrReplace alle gewünschten Konvertierungen vorsehen
  • Datei als String einlesen (für FileStream ist die Dateigröße bekannt)
  • in einer Schleife für jedes Element von arrSearch/arrReplace mit StringReplace bearbeiten
  • dann den String wieder als Textdatei speichern
Gruß Jürgen

benst 10. Sep 2006 16:01

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

3_of_8 10. Sep 2006 16:05

Re: Datei laden, speichern -> ergibt nicht die gleiche Da
 
Wäre es nicht besser, die Umlaute mit Entitäten zu maskieren? Also ü statt ü?

benst 10. Sep 2006 16:07

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.

Christian Seehase 10. Sep 2006 17:32

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 08:00 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