AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Datei laden, speichern -> ergibt nicht die gleiche Datei ??
Thema durchsuchen
Ansicht
Themen-Optionen

Datei laden, speichern -> ergibt nicht die gleiche Datei ??

Ein Thema von benst · begonnen am 10. Sep 2006 · letzter Beitrag vom 10. Sep 2006
Antwort Antwort
benst

Registriert seit: 20. Jun 2004
155 Beiträge
 
Delphi 5 Standard
 
#1

Datei laden, speichern -> ergibt nicht die gleiche Datei

  Alt 10. Sep 2006, 14:07
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
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Datei laden, speichern -> ergibt nicht die gleiche Da

  Alt 10. Sep 2006, 14:15
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
benst

Registriert seit: 20. Jun 2004
155 Beiträge
 
Delphi 5 Standard
 
#3

Re: Datei laden, speichern -> ergibt nicht die gleiche Da

  Alt 10. Sep 2006, 14:59
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
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#4

Re: Datei laden, speichern -> ergibt nicht die gleiche Da

  Alt 10. Sep 2006, 15:42
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
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#5

Re: Datei laden, speichern -> ergibt nicht die gleiche Da

  Alt 10. Sep 2006, 15:46
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
benst

Registriert seit: 20. Jun 2004
155 Beiträge
 
Delphi 5 Standard
 
#6

Re: Datei laden, speichern -> ergibt nicht die gleiche Da

  Alt 10. Sep 2006, 16:01
@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
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Datei laden, speichern -> ergibt nicht die gleiche Da

  Alt 10. Sep 2006, 16:05
Wäre es nicht besser, die Umlaute mit Entitäten zu maskieren? Also ü statt ü?
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
benst

Registriert seit: 20. Jun 2004
155 Beiträge
 
Delphi 5 Standard
 
#8

Re: Datei laden, speichern -> ergibt nicht die gleiche Da

  Alt 10. Sep 2006, 16:07
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.107 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Datei laden, speichern -> ergibt nicht die gleiche Da

  Alt 10. Sep 2006, 17:32
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  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 04:51 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