Entwickler-Ecke

Sonstiges (Delphi) - TStringlist von Leerzeichen und Leerzeilen säubern


sintec - Do 28.06.07 15:21
Titel: TStringlist von Leerzeichen und Leerzeilen säubern
Hallo leutz,

ich habe folgendes Problem:

In meinem Programm lade ich eine Textdatei in eine TStringlist,die möglicherweise Leerzeilen und Leerzeichen enthalten kann.
Die TStringlist möchte ich von den Leerzeilen und Leerzeichen, die am ende einer Zeile sind bereinigen (nur die Leerzeichen die am ende einer Zeile sind möchte ich weg haben, nicht die dazwischen sind)
Habe schon vieles ausprobiert doch es kommt ständig zu Programmabstürzen.

Hier sind zwei meiner mehreren Versuche:

Variante 1:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
index.LoadFromFile(dlg_openindexfile.FileName);

  i:=0;
  while (i<=index.Count-1do
  begin
    datei := index[i];
    if (datei[length(datei)] = ' 'then
    begin
      datei := copy(datei,0,Length(datei)-1);
      index[i] := datei;
    end
    else
      if datei = '' then
      begin
        index.Delete(i);
      end
      else
        inc(i);
  end;


Variante 2:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
for I := 0 to index.Count - 1 do
  begin
    if index[i] <> '' then
    begin
      datei := index[i];
      while (datei[length(datei)] = ' 'and (index[i] <> '')do
      begin
        datei := copy(datei,0,Length(datei)-1);
        index[i] := datei;
      end;
    end;
  end;

  i := 0;
  while (i<=index.Count-1do
  begin
    if index[i] = '' then
    begin
      index.Delete(i);
    end
    else
      inc(i);
  end;


bei Variante 2 funktionierte die zweite Hälfte, die die TStringlist von Leerzeilen befreite.

Bekomme bei beiden Variante eine Fehlermeldung "Zugriffsverletzung bei Adresse ******"

Kann mir jemand bitte helfen?


Marco D. - Do 28.06.07 15:27

Man sollte in einer Schleife, welche die Liste von vorne durchläuft, nie Einträge entfernen, dann kommt es in der Regel zu Zugriffsverletzungen. Lass die Schleife von hinten durch die Liste laufen:

Delphi-Quelltext
1:
2:
for i := index.count - 1 to 0 do
begin...


chrisw - Do 28.06.07 15:28

Guck mal nach

Delphi-Quelltext
1:
Trim();                    


FiceGoesDelphi - Do 28.06.07 15:28

Such mal in der OH nach "trim" ;)

EDIT: Das war höchstens 1 Sekunde @ chrisw *gg* ;)


chrisw - Do 28.06.07 15:34

@FiceGoesDelphi
Du hälst dich zu lange mit den Smilies auf :!:


sintec - Fr 29.06.07 08:25

Welche Variante wäre besser/schneller/effektiver und wo soll ich Trim() benutzen?

EDIT:

So wie es aussieht klappt es so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
i := 0;
  while (i<=index.Count-1do
  begin
    if trim(index[i]) = '' then
    begin
      index.Delete(i);
    end
    else
      inc(i);
  end;

  for I := 0 to index.Count - 1 do
  begin
    if index[i] <> '' then
    begin
      datei := index[i];
      while (datei[length(datei)] = ' 'and (index[i] <> '')do
      begin
        datei := copy(datei,0,Length(datei)-1);
        index[i] := datei;
      end;
    end;
  end;


Vielen Dank an alle die geholfen haben.


Lannes - Fr 29.06.07 10:42

Hallo,

das dürfte schneller sein, es wird nur wenig auf sL[i] zugriffen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
  i := sL.Count-1;
  while i >= 0 do
    begin
    s := sL[i];
    x := Length(s);
    if Trim(s) = '' then
      sL.Delete(i)
      else
        begin
        while s[x] = ' ' do
          dec(x);
        if x <> Length(s) then
          begin
          SetLength(s,x);
          sL[i] := s;
          end;
        dec(i);
        end;
    end;
bin mir aber sicher das das noch verbesserbar ist. :wink: