Autor Beitrag
badstuberl
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 19.04.11 11:25 
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!:)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 19.04.11 11: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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 19.04.11 11: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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Di 19.04.11 12:04 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 19.04.11 12: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:
ausblenden 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;


Zuletzt bearbeitet von jasocul am Di 19.04.11 12:36, insgesamt 1-mal bearbeitet
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Di 19.04.11 12: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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 19.04.11 12:30 
War auch als konstruktive Kritik gemeint und nicht als fiese Besserwisserei (vielleicht doch ein bisschen :mrgreen:) :wink:
badstuberl Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 19.04.11 13: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 19.04.11 13:31 
Übergibst du sie denn an die entsprechende Prozedur? Oder ist sie unter private des Formulars deklariert?
badstuberl Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 19.04.11 13: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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Di 19.04.11 13:49 
Was vielleicht daran liegt, dass du sie freigibst? :?:
guinnes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: Di 19.04.11 13:51 
user profile iconbadstuberl hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 19.04.11 13: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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 19.04.11 13: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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 19.04.11 14:04 
:rofl: