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-1) do 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-1) do 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
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-1) do 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:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!