Rubrik: Dateisystem · Dateien lesen/schreiben | VB-Versionen: VB6 | 08.03.02 |
Zeile aus einer Textdatei löschen Hier zeigen wir Ihnen verschiedene Möglichkeiten, um eine Textzeile aus einer Textdatei zu löschen. | ||
Autor: Dieter Otter | Bewertung: | Views: 37.238 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Mit unserem Tipp Textdateien komfortabel einlesen und schreiben haben wir Ihnen einige nützliche Prozeduren zum Lesen und Schreiben von Textdateien vorgestellt. Was allerdings noch fehlt, ist das gezielte Löschen einer bestimmten Zeile innerhalb der Textdatei.
Hierfür gibt es verschiedene Möglichkeiten
1. Datei zeilenweise lesen und temporär zwischenspeichern
Die wohl am naheliegendste Methode ist das zeilenweise Einlesen der Textdatei und gleichzeitige Schreiben in eine neue temporäre Datei - aber nur, wenn es sich bei der aktuell eingelesene Zeile nicht um die zu löschende Zeile handelt. Nach dem Lesen-/Schreibvorgang wird die Originaldatei gelöscht und die temporäre Datei in die Originaldatei umbenannt. Das ganze sieht dann in etwa so aus:
' Bestimmte Zeile aus einer Textdatei löschen Public Sub txt_DeleteLine( _ ByVal sFilename As String, _ ByVal lLineToDelete As Long) Dim F As Integer Dim N As Integer Dim sFileTemp As String Dim lCount As Long Dim sLine As String Dim bResult As Boolean ' temporäre Datei zum Zwischenspeichern sFileTemp = sFilename & "~" ' Textdatei zum Lesen öffnen F = FreeFile Open sFilename For Input As #F ' temporäre Datei zum Schreiben öffnen N = FreeFile Open sFileTemp For Output As #N ' Textdatei zeilenweise einlesen und schreiben While Not EOF(F) lCount = lCount + 1 Line Input #F, sLine If lCount <> lLineToDelete Then Print #N, sLine Wend ' Dateien schliessen Close #F: Close #N ' Textdatei löschen Kill sFilename ' temporäre Datei in Textdatei umbenennen Name sFileTemp As sFilename End Sub
Das funktioniert soweit ganz gut.
Bei Textdateien ab einer bestimmten Anzahl Zeilen (> 10.000) gibt es aber noch eine Variante, die etwas schneller arbeitet.
2. Datei komplett einlesen, in ein Array umwandeln und gezielt das gewünschte Array-Element löschen
Zunächst lesen wir den Inhalt der Textdatei in einem Rutsch aus und speichern den Inhalt in einer String-Variable:
Dim F As Integer Dim sInhalt As String F = FreeFile Open sFilename For Binary As #F sInhalt = Space$(Lof(F)) Get #F, , sInhalt Close #F
Da es sich um eine textbasierte Datei handelt, sind die einzelnen Zeilen durch ein vbCrLf voneinander getrennt. Über die Split-Funktion machen wir aus dem String ein String-Array.
Dim sLines() As String sLines = Split(sInhalt, vbCrLf) sInhalt = ""
Nun löschen wir die gewünschte Zeile aus dem Array:
Dim I As Long Dim lCount As Long lCount = UBound(sLines) - 1 For I = lLineToDelete - 1 To lCount - 1 sLines(I) = sLines(I + 1) Next I ReDim Preserve sLines(lCount - 1)
Anschliessend machen wir aus dem String-Array wieder einen normalen String und speichern diesen zurück in die Datei:
F = FreeFile Open sFilename For Output As #F Print #F, Join(sLines, vbCrLf); Close #F
Und hier die vollständig dokumentierte Prozedur txt_DeleteLine:
' Bestimmte Zeile aus einer Textdatei löschen Public Sub txt_DeleteLine( _ ByVal sFilename As String, _ ByVal lLineToDelete As Long) Dim F As Integer Dim I As Long Dim lCount As Long Dim sInhalt As String Dim sLines() As String ' Textdatei in einem Rutsch einlesen F = FreeFile Open sFilename For Binary As #F sInhalt = Space$(LOF(F)) Get #F, , sInhalt Close #F ' Inhalt in ein String-Array umwandeln sLines = Split(sInhalt, vbCrLf) sInhalt = "" ' gewünschtes Element (Zeile) aus dem Array entfernen lCount = UBound(sLines) - 1 For I = lLineToDelete - 1 To lCount - 1 sLines(I) = sLines(I + 1) Next I ReDim Preserve sLines(lCount - 1) ' Inhalt speichern F = FreeFile Open sFilename For Output As #F Print #F, Join(sLines, vbCrLf); Close #F End Sub