Entwickler-Ecke

Dateizugriff - in delphi bestimmte zeilen aus einer datei löschen


badstuberl - Di 19.04.11 10:25
Titel: in delphi bestimmte zeilen aus einer datei löschen
hallo beisammen!
ich hoffe, ihr könnt mir helfen.
ich würde gerne gezielt zeilen in einer textdatei löschen.
sowas wie:
<snip here>
hier
steht
nun text
</snip here>

und danach soll der text so aussehen:
<snip here>
</snip here>

also der kram dazwischen soll weg. geht sowas in delphi?

danke!:)


Delete - Di 19.04.11 10:27

Lad die Datei in eine StringListe. Finde die Zeilen zwischen denn du löschen willst mit pos und lösche die Zeilen dazwischen. Das ganze kannst du in einer Schleife über die Zeichenketten der StringListe machen.


badstuberl - Di 19.04.11 10:58

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

also mit indexof kriege ich ja schonmal die zeilennummern raus. dann kann ich ja sowas sagen wie

Delphi-Quelltext
1:
2:
3:
4:
for i:=snipstart to snipende
begin
 stringliste[snipstart].delete;
end;

das klappt aber leider nicht. ich bekomme ein E2018, record, objekt oder klassentyp erforderlich...

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


HenryHux - Di 19.04.11 11:04


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var List : TStringList;
    i : Integer;
begin
  List := TStringList.Create;
  List.LoadFromFile('Pfad zur Datei');
  for i := 0 to List.Count do begin
    if pos('Zu löschende Zeile', List[i]) > 0 then
      List.Delete(i);
  end;
end;


lg


jasocul - Di 19.04.11 11:21

Der Source von user profile iconHenryHux wird nicht funktionieren.
Es wird eine Exception kommen, da die Schleife über das Listen-Ende hinaus geht.
Jedes Delete verändert auch noch zusätzlich den Wert von List.Count.

Besser so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var List : TStringList;
    i : Integer;
begin
  List := TStringList.Create;
  List.LoadFromFile('<richtige Datei reinschreiben>');
  for i := List.Count-1 downto 0 do 
  begin
    if pos('Zu löschende Zeile', List.Lines[i]) > 0 then // Die Bedingung muss natürlich auch angepasst werden
      List.Delete(i);
  end;
  List.SaveTofile('<Dateiname>');
  List.Free;
end;


HenryHux - Di 19.04.11 11:26

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Der Source von user profile iconHenryHux wird nicht funktionieren.
Es wird eine Exception kommen, da die Schleife über das Listen-Ende hinaus geht.
Jedes Delete verändert auch noch zusätzlich den Wert von List.Count.


Ok, das stimmt, schnell getippt ohne nachzudenken :D


jasocul - Di 19.04.11 11:30

War auch als konstruktive Kritik gemeint und nicht als fiese Besserwisserei (vielleicht doch ein bisschen :mrgreen:) :wink:


badstuberl - Di 19.04.11 12:24

danke schon mal für eure antworten! ich möchte nun nach dem löschen auch noch was einfügen. dafür habe ich mir global eine tstringlist deklariert, die wird im main-teil per create erzeugt. nun möchte ich diese stringlist in einer prozedur füllen und später in "main" wieder ausgeben. aber das klappt nicht. die stringlist scheint nur innerhalb der prozedur "zu leben", nach der prozedur ist die stringlist wieder leer, obwohl sie in "main" konstruiert wurde. was läuft da falsch?


jaenicke - Di 19.04.11 12:31

Übergibst du sie denn an die entsprechende Prozedur? Oder ist sie unter private des Formulars deklariert?


badstuberl - Di 19.04.11 12:33

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Übergibst du sie denn an die entsprechende Prozedur? Oder ist sie unter private des Formulars deklariert?


sie ist global unter "var" deklariert, ist ne konsolen-app... und nein, noch übergebe ich sie nicht ;)

EDIT: übergeben half auch nicht...

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

ich schreib mal den code verkürzt hin:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
program test;

uses
  SysUtils, Classes;

var mystrings: TStringlist;

procedure fillstringlist;
begin
  mystrings.add('bla');
  mystrings.add('something');
  ...
end;


begin
  mystrings := tstringlist.Create;
  fillstringlist;
  for i := 0 to mystrings.count-1 do
    writeln(mystrings[i]));
  mystrings.free;
end.


wie gesagt: innerhalb der prozedur ist die stringlist gefüllt, bei verlassen sind die werte futsch.

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


HenryHux - Di 19.04.11 12:49

Was vielleicht daran liegt, dass du sie freigibst? :?:


guinnes - Di 19.04.11 12:51

user profile iconbadstuberl hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
  mystrings.free;
end.


wie gesagt: innerhalb der prozedur ist die stringlist gefüllt, bei verlassen sind die werte futsch.

Wo sollten die Werte wohl sein, wenn du die Stringliste wieder freigibts ?


jasocul - Di 19.04.11 12:55

Er macht es doch richtig.
Es ist eine Konsolen-Anwendung. Die Freigabe erfolgt erst am Ende des Programms.
Er füllt die Liste mit seiner Routine fillstringlist. Danach gibts eine Schleife, wo er die Liste ausgibt. Erst danach kommt die Freigabe.

Was aber in der Procedure bei "..." noch alles passiert, kann ich auch nicht sagen.


badstuberl - Di 19.04.11 12:59

omg... ich bin wirklich ein noob... sorry leutz! hat alles funktioniert. man sollte evtl. noch ein readln; hinter die ausgabe machen, dann sieht man auch seinen text -.-


jasocul - Di 19.04.11 13:04

:rofl: