Autor |
Beitrag |
MephistoFFF
      
Beiträge: 60
Win 7
|
Verfasst: Do 05.02.09 16:41
Und schon wieder hat er eine Frage^^
Hab schon gesucht ( Google und auch hier ), aber nichts Brauchbares gefunden...
Wie kann ich Folgendes am besten lösen?
Das Programm soll aus einer Textdatei ( *.txt ) eine bestimmte Zeile löschen. Wichtig ist, dass die gesamte Zeile gelöscht wird, und das Nachfolgende sozusagen "aufrückt". Das beste wäre, wenn man die zu löschende Zeile genau nach dem in der Zeile stehenden Text ermitteln könnte.
Vielen Dank schonmal  .
mfG
Zuletzt bearbeitet von MephistoFFF am Do 05.02.09 19:31, insgesamt 1-mal bearbeitet
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 05.02.09 17:06
Lad die Datei in eine TStringlist, durchsuche diese zeilenweise nach dem Text und lösche die betreffende Zeile bei Fund. Anschließend wieder speichern. Bedenke aber dabei, dass Du die Schleife absteigend definieren musst (zumindest bei einer for-Schleife), sonst knallt es.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 05.02.09 17:07
Wenn die Datei nicht allzu groß ist, dann kannst du eine TStringList nehmen, die Datei da hineinladen, direkt Delete aufrufen und die Datei wieder speichern. 
|
|
MephistoFFF 
      
Beiträge: 60
Win 7
|
Verfasst: Do 05.02.09 17:17
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Button1Click(Sender: TObject); var strlst: TStringList; begin strlst := TStringList.Create; try strlst.LoadFromFile('test.txt'); while (strlst.IndexOf('abcd') <> -1) do strlst.Delete(strlst.IndexOf('abcd')); strlst.SaveToFile('test.txt'); finally strlst.Free; end; end; |
So hab ichs schon probiert, aber da passiert garnichts...
Dateinamen etc. sind natürlich angepasst  ...
mfG
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 05.02.09 17:20
Was steht denn in der betreffenden Zeile? Nur 'abcd' oder noch etwas anderes?
|
|
MephistoFFF 
      
Beiträge: 60
Win 7
|
Verfasst: Do 05.02.09 17:25
DeddyH hat folgendes geschrieben : | Was steht denn in der betreffenden Zeile? Nur 'abcd' oder noch etwas anderes? |
Wie gesagt, das wird dann mit ListBox1.Items.Strings[strtoint(Index)] ersetzt ( das abcd )...
Der Text ist dann ein kurzer Text, er kann, muss aber nicht, Leerzeichen und "." enthalten...
mfG
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 05.02.09 17:43
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var strlst: TStringList; i: integer; begin strlst := TStringList.Create; try strlst.LoadFromFile('test.txt'); for i := strlst.Count - 1 downto 0 do if Pos('abcd',strlst[i]) > 0 then strlst.Delete(i); strlst.SaveToFile('test.txt'); finally strlst.Free; end; end; |
|
|
MephistoFFF 
      
Beiträge: 60
Win 7
|
Verfasst: Do 05.02.09 18:40
DeddyH hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var strlst: TStringList; i: integer; begin strlst := TStringList.Create; try strlst.LoadFromFile('test.txt'); for i := strlst.Count - 1 downto 0 do if Pos('abcd',strlst[i]) > 0 then strlst.Delete(i); strlst.SaveToFile('test.txt'); finally strlst.Free; end; end; | |
Der Code hier funktioniert wunderbar, aber erst nachdem ich einen anderen Fehler behoben habe, aufgrund dessen die Prozedur zum löschen nie aufgerufen wurde... ^^
Also danke nochmal an alle^^
mfG
|
|
MephistoFFF 
      
Beiträge: 60
Win 7
|
Verfasst: Do 05.02.09 19:33
Sorry für den Doppelpost, aber mir ist gerade noch was aufgefallen:
Es funktioniert soweit alles wunderbar, die Zeilen rutschen auch nach...
ABER: Am Ende der Textdatei entstehen neue Zeilen, zwar ohne text, aber sie sind eben da und werden dementsprechend mit in die listbox übernommen, was ein ziemlich großes Problem darstellt^^
kann ich das irgendwie beheben?
mfG
EDIT: habs jetzt erstmal provisorisch so gelöst:
Delphi-Quelltext 1: 2: 3: 4: 5:
| for i := 0 to Listbox1.items.count -1 do if ListBox1.Items.Strings[i]= '' then begin listbox1.items.Delete(i); end; |
^^
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 05.02.09 20:28
Delphi-Quelltext 1:
| ListBox1.Text := Trim(ListBox1.Text); | 
|
|
MephistoFFF 
      
Beiträge: 60
Win 7
|
Verfasst: Do 05.02.09 20:33
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 05.02.09 20:40
F1 hilft.
Trim entfernt alle Leerzeichen und Steuerzeichen am Anfang und Ende eines Strings.
|
|
MephistoFFF 
      
Beiträge: 60
Win 7
|
Verfasst: Do 05.02.09 20:44
jaenicke hat folgendes geschrieben : | F1 hilft.
Trim entfernt alle Leerzeichen und Steuerzeichen am Anfang und Ende eines Strings. |
Sehr gut, vielen Dank...
Damit dürfte das Thema aber nun wirklich erledigt sein^^
mfG
|
|