none
Bestimmte Zeile einer Textdatei löschen RRS feed

  • Frage

  • Hallo,

    ich habe folgendes Problem:

    Ich habe eine Listbox mit Einträgen, die in einer Textdatei stehen (Jede Zeile in der Datei entspricht ein Eintrag in der Liste). Nun möchte ich bei EINER ausgwählten Zeile in der Listbox und einem bestätigen mit einem Button den Eintrag in der Datei löschen.

    Ich habe zwar schon probiert, ein zeilenweises Einlesen der Datei, aber so richtig zum Ziel bin ich nicht gekommen.

    Vielen Dank

    Dienstag, 27. Mai 2014 12:09

Antworten

  • Hi,

    vorausgesetzt, die Einträge in der Datei sind eindeutig (zB "eins", "zwei", "drei", "vier"), könntest du folgendermaßen vorgehen:

    var selectedText = "drei";  // hier den tatsächlich ausgewählten Wert eintragen
    var fileName = "..."; // der Name deiner Datei
    
    var unselectedLines = 
       from line in File.ReadAllLines(fileName).Where(l => l != selectedText)
       select line;
    
    File.WriteAllLines(fileName, unselectedLines);

    Das ergibt eine Datei, die alle Zeilen außer "drei" enthält. Die mittlere LINQ-Anweisung übernimmt dabei das Einlesen der Datei und das Aussortieren der Zeile mit dem ausgewählten Text (es wird also eine neue Texte-Liste ohne den betroffenen Wert erstellt). Die verbleibenden Texte werden zeilenweise in die Datei (zurück)geschrieben.

    Zum besseren Verständnis habe ich Prüfungen, ob die Datei existiert, ob sie beschreibbar ist usw. weggelassen.

    Wenn du noch Erläuterungen brauchst, sag Bescheid.

    Gruß
    Jürgen

    • Als Antwort markiert noob81 Dienstag, 27. Mai 2014 13:42
    Dienstag, 27. Mai 2014 12:53

Alle Antworten

  • Hi,

    vorausgesetzt, die Einträge in der Datei sind eindeutig (zB "eins", "zwei", "drei", "vier"), könntest du folgendermaßen vorgehen:

    var selectedText = "drei";  // hier den tatsächlich ausgewählten Wert eintragen
    var fileName = "..."; // der Name deiner Datei
    
    var unselectedLines = 
       from line in File.ReadAllLines(fileName).Where(l => l != selectedText)
       select line;
    
    File.WriteAllLines(fileName, unselectedLines);

    Das ergibt eine Datei, die alle Zeilen außer "drei" enthält. Die mittlere LINQ-Anweisung übernimmt dabei das Einlesen der Datei und das Aussortieren der Zeile mit dem ausgewählten Text (es wird also eine neue Texte-Liste ohne den betroffenen Wert erstellt). Die verbleibenden Texte werden zeilenweise in die Datei (zurück)geschrieben.

    Zum besseren Verständnis habe ich Prüfungen, ob die Datei existiert, ob sie beschreibbar ist usw. weggelassen.

    Wenn du noch Erläuterungen brauchst, sag Bescheid.

    Gruß
    Jürgen

    • Als Antwort markiert noob81 Dienstag, 27. Mai 2014 13:42
    Dienstag, 27. Mai 2014 12:53
  • es funktioniert leider nicht. Ich bekomme nur folgende Warnung

    Unbeabsichtigter Verweisvergleich. Wandeln Sie die rechte Seite in den Typ 'string' um, um einen Wertvergleich durchzuführen.   

    bei

    l != selectedText

    Was meint der damit?

    Dienstag, 27. Mai 2014 13:21
  • Hallo,

    der Fehler meint, das l oder selectedText kein string ist. Die Meldung spricht von der rechten Seite, also wandle diese in einen String um:

    var selectedTextString = selectedText.ToString();
    //Benutze selectedTextString im LINQ-Ausdruck
    PS: Der LINQ-Ausdruck geht auch einfacher:
    var unselectedLines = File.ReadAllLines(fileName).Where(l => l != selectedTextString );
    Jürgen hat noch die C# Schlüsselwörter für LINQ herum gepackt, das ist nicht nötig wenn man nur die LINQ-Methoden benutzt.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 27. Mai 2014 13:33
    Moderator
  • Super, es funzt alles, danke danke danke
    Dienstag, 27. Mai 2014 13:42