Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Leerzeilen aus Ini-Datei entfernen (https://www.delphipraxis.net/57797-leerzeilen-aus-ini-datei-entfernen.html)

Ralf Stehle 26. Nov 2005 23:46


Leerzeilen aus Ini-Datei entfernen
 
Ich lege in einer Ini-Datei Sections mit Datum als Namen an und lösche diese auch wieder, wenn Sie älter als 7 Tage sind

[15.10.2005]
TXT1=Value1
TXT2=Value2

[16.10.2005]
TXT1=Value1
TXT2=Value2

usw.


beim Löschen der Section
Delphi-Quellcode:
Ini.EraseSection([16.10.2005])
wird aber die Leerzeile nicht gelöscht. Nach einigen Wochen entsteht so eine Ini-Datei mit ganz vielen Leerzeilen

Ich habe eine umständliche Programmierung gefunden, die Leerzeilen löscht

Delphi-Quellcode:
  {*****    Leerzeilen herausschneiden, d.h. Ascii-Folge 13 10 13 10      *****}
  fs := TFilestream.Create(BefundListe + 'EKGBefunde.txt' ,fmopenread or fmShareDenyNone);
  SetLength(ba, fs.Size);
  fs.Read(ba[0], Length(ba));
  fs.Free;

  i := 0; j := 0;
  for i := 0 to Length(ba) do begin
    if NOT ((ba[i] = 10) AND (ba[i-1] = 13) AND (ba[i-2] = 10))
    AND NOT ((ba[i] = 13) AND (ba[i-1] = 10) AND (ba[i-2] = 13))
    then
    begin
      SetLength(bn, j + 1); bn[j] := ba[i]; //s := s + ' ' + IntToStr(ba[i]);
      inc(j);
    end;
  end;
  fs := TFileStream.Create(BefundListe + 'EKGBefunde.txt', fmCreate);
  fs.Writebuffer(bn[0], Length(bn));
  fs.Free;
  {****************************************************************************}

In dem Code wird Byte-weise abgefragt, ob die Ascii-Folge 13 10 mehr als einmal hintereinander vorkommt und nur dann der zweite Puffer gefüllt, wenn das nicht der Fall ist

Hat jemand einen Tipp wie das ohne FileStream direkt mit Ini.EraseStream geht?

Übrigens wurde mal die Frage gepostet, wie man Leerzeilen einfügt, das geht einfach so
Delphi-Quellcode:
Ini.WriteString(FormatDateTime('dd.mm.yyyy',now), 'TXT1' , s + #13#10)
Ralf

Christian Seehase 27. Nov 2005 00:09

Re: Leerzeilen aus Ini-Datei entfernen
 
Moin Ralf,

der ganz einfache Weg:
INI-Datei in eine TStringList laden, und dann mit

Delphi-Quellcode:
StringList.Text := StringReplace(StringList.Text,#13#10#13#10,#13#10,[rfReplaceAll]);
die doppelten Zeilen entfernen (ungetestet).
Anschliessend dann die StringList wieder speichern.
Nicht besonders performant (eher im Gegenteil ;-)), aber für ein gelegentliches benutzen wohl ausreichend.
(Vorausgesetzt, die INI-Datei ist nicht allzugross)

Martin K 27. Nov 2005 00:15

Re: Leerzeilen aus Ini-Datei entfernen
 
1.
Warum fügst du überhaupt erst Leerzeilen ein?
Das ist doch nicht schlimm, wenn die ini so aussieht:

[15.10.2005]
TXT1=Value1
TXT2=Value2
[16.10.2005]
TXT1=Value1
TXT2=Value2
usw.

Oder?


2.
Meine Methode mit einer StringList wäre diese:
Delphi-Quellcode:
procedure LeerzeilenLoeschen(FileName: String);
var S: TStringList; i: Integer;
begin
  S:=TStringList.Create;
  S.LoadFromFile(FileName);
  For i:=0 to S.Count-1 do
  begin
    If S[i]='' then S.Delete(i);
  end;
  S.SaveToFile(FileName);
  S.Free;
end;
Ich habe den Code zwar nicht getestet, aber theoretisch müsste das so funktionieren.

Binärbaum 27. Nov 2005 02:51

Re: Leerzeilen aus Ini-Datei entfernen
 
Zitat:

Zitat von Martin K
Warum fügst du überhaupt erst Leerzeilen ein?

Vermutung:
Das liegt wohl daran, dass die Prozeduren von TIniFile nach jeder Section automatisch eine Leerzeile einfügen. Wenn man eine Section dann löscht, werden zwar alle Zeilen mit Werten gelöscht, aber keine Leerzeilen.

MfG
Binärbaum

Phistev 27. Nov 2005 07:35

Re: Leerzeilen aus Ini-Datei entfernen
 
@Martin K: Lass die for-Schleife rückwärts laufen, sonst gibt's hinterher Probleme (Die Bedingung wird nur einmal ausgewertet...). Außerdem gibt's das schon in der Code-Lib :mrgreen:

Ralf Stehle 27. Nov 2005 08:19

Re: Leerzeilen aus Ini-Datei entfernen
 
Vielen Dank für Eure Hilfe, das hat mir schon sehr geholfen

Ralf

Martin K 27. Nov 2005 09:27

Re: Leerzeilen aus Ini-Datei entfernen
 
Zitat:

Zitat von Binärbaum
Zitat:

Zitat von Martin K
Warum fügst du überhaupt erst Leerzeilen ein?

Vermutung:
Das liegt wohl daran, dass die Prozeduren von TIniFile nach jeder Section automatisch eine Leerzeile einfügen. Wenn man eine Section dann löscht, werden zwar alle Zeilen mit Werten gelöscht, aber keine Leerzeilen.

MfG
Binärbaum

Also bei mir ist das nicht so !

Wenn ich eine Section in eine Ini schreibe, dann gibt es dort keine einzige Leerzeile.

Die ini sieht dann ungefähr so aus:
[15.10.2005]
TXT1=Value1
TXT2=Value2
[16.10.2005]
TXT1=Value1
TXT2=Value2
usw.


Vorraussetzung ist natürlich, dass man diesen Befehl nicht verwendet:
Zitat:

Zitat von Ralf Stehle
Übrigens wurde mal die Frage gepostet, wie man Leerzeilen einfügt, das geht einfach so
Delphi-Quellcode:
Ini.WriteString(FormatDateTime('dd.mm.yyyy',now), 'TXT1' , s + #13#10)
Ralf


Martin K 27. Nov 2005 09:46

Re: Leerzeilen aus Ini-Datei entfernen
 
Zitat:

Zitat von Phistev
@Martin K: Lass die for-Schleife rückwärts laufen, sonst gibt's hinterher Probleme (Die Bedingung wird nur einmal ausgewertet...). Außerdem gibt's das schon in der Code-Lib :mrgreen:

Hast recht, hab meinen Code geändert:
Delphi-Quellcode:
procedure LeerzeilenLoeschen(FileName: String);
var S: TStringList; i: Integer;
begin
  S:=TStringList.Create;
  S.LoadFromFile(FileName);
  i:=0;
  Repeat
    If S[i]='' then S.Delete(i)
    else Inc(i);
  Until i=S.Count;
  S.SaveToFile(FileName);
  S.Free;
end;
So funzt es aber, ich hab's getestet !!!

@Ralf Stehle:
Ich bleib dabei, wenn man erst gar keine Leerzeilen einfügt (mit Absicht, also +#13#10 oder so), dann hat die ini auch gar keine !


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:45 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