vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2021
 
zurück
Rubrik: Dateisystem · Dateien lesen/schreiben   |   VB-Versionen: VB608.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 OtterBewertung:     [ Jetzt bewerten ]Views:  34.893 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 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

Dieser Tipp wurde bereits 34.893 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2021 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel