Textfile auslesen und dann bestimmte Wörter entfernen auch über eine "Badwordlist"

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Textfile auslesen und dann bestimmte Wörter entfernen auch über eine "Badwordlist"

    Hallo Forum,

    Ich möchte gerne, eine "Badwordlist erstellen" leider habe ich keine Idee wie ich dies Umsetzen kann.
    Ich habe bisher immer damit gearbeitet:

    Quellcode

    1. ​ If TextBox1.Text.Contains(":=)") Then
    2. TextBox1.Text = TextBox1.Text.Replace(":=)", "")
    3. End If


    Jetzt wird die Geschichte aber immer länger was ich da entfernen möchte. Ich lese eine Textdatei aus, danach soll aus der "Badwordlist.txt" die Wörter ausgelesen werden die automatisch entfernt werden sollen.

    Hat jemand eine Idee bitte wie ich dies Umsetzen kann? ein Beispiel wäre auch ganz nett.

    Danke :)
    Erst mit Dim ListOfBadWords = IO.File.ReadAllLines("BadWordList.txt").ToList alle Wörter in eine Liste einlesen und dann Deinen Code mit einer For-Each-Loop umschließen.

    VB.NET-Quellcode

    1. For Each BadWord in ListOfBadWords
    2. If TextBox1.Text.Contains(BadWord) Then
    3. TextBox1.Text = TextBox1.Text.Replace(BadWord, "")
    4. End If
    5. Next

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo @VBisMine

    1 Wort pro Zeile oder muss man diese nacheinander mit einen Komma trennen?


    Das ist egal. Schau dir die Funktion Contains mal an. Hineinklicken oder markieren dann ​F1 drücken.
    Contains gibt True zurück wenn der Text der Variable im Text des Files enthalten ist.

    Wäre unübersichtlich aber du könntest sie auch in einer wurscht schreiben.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Sorry, ich war zu schnell beim lesen.
    Muss ich mehr aufpassen.

    Hast natürlich völlig recht!!
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    @VBisMine: Der Code ist momentan so ausgelegt, dass das Programm ein bad word pro Zeile erwartet. Ich würde es an Deiner Stelle so belassen. Denn man könnte zwar alle Wörter nacheinander schreiben und mit Komma trennen. Doch dann dürfte keines der Wörter ein Komma enthalten. Beispiel:

    Quellcode

    1. Microsoft
    2. Kam Song Ul
    3. Ötzi
    4. Theater
    5. burning, death, destruction

    Angenommen, diese Wortgruppen stünden in Deiner Datei. Mit dem bisherigen Code werden sie alle rausgefiltert. Doch was passiert, wenn sie alle per Komma getrennt werden:
    Microsoft,Kam Song Ul,Ötzi,Theater,burning, death, destruction
    Plötzlich werden die drei letzten Wörter nicht mehr dann rausgefiltert, wenn sie zusammen auftreten, sondern sie werden einzeln rausgefiltert, auch wenn man nur die Wortgruppe im Visier hatte.
    => das Trennen in einzelne Zeilen ist hier sinnvoll; Ein Trennzeichen führt immer dazu, dass man jenes Zeichen in den bad words nicht drinhaben darf. Klar, Du könntest ein exotisches Zeichen als Trenner verwenden. Aber irgendwann holt es Dich ein. Entweder beim Thema Datei-Encoding; weil ein User ein Sonder-bad-word einführen will; oder weil Du die Eingaben einschränken müsstest.
    mMn: lass es bei den zeilenweisen Wörtern, solange wie möglich. Oder steige auf serialisierbare Datenstrukturen um. Ggf. ein Thema für einen späteren Zeitpunkt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hi
    bei langen Texten und/oder Wortlisten ist die obige Methode übrigens nicht effizient. Besser wäre vmtl. ein StringBuilder oder noch besser ein eigener Algorithmus dafür - der sprengt aber vmtl. den Rahmen, außer du hast vor, große Mengen an Daten zu verarbeiten.
    Die Contains-Abfrage ist übrigens überflüssig. Wenn Contains False zurückgibt, wird ja auch Replace nichts ersetzen.

    Viele Grüße
    ~blaze~
    Vollzitat entfernt
    @VaporiZed

    Danke für dein Kommentar.
    Nun habe ich ein Problem! wenn ich die normaler Variante ohne die Liste nehme, filtert die Funktion z.B. Hallo ich bin ein test 12334 -> 12334 kommt weg. alles gut!
    Benutze ich aber die Variante die du mir gezeigt hast, wird egal in welchen Text wenn jetzt extra eine 1 oder 2 oder 3 steht die auch entfernt! dasist natürlich mist! es soll ja nur 12334 entfernen und nicht wenn jetzt z.B. da steht: Hallo ich bin ein test 12334 - wir benötigen noch 1 mal Ketchup, zack wird die 1 auch entfernt.
    wie lässt sich das beheben ?

    Danke :)

    ~blaze~: Vollzitat entfernt, Erwähnung eingefügt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    Da komm ich nicht ganz hinterher.
    bad word list:

    Quellcode

    1. Microsoft
    2. Kam Song Ul
    3. Ötzi
    4. Theater
    5. burning, death, destruction
    6. 12334

    Text = Hallo ich bin ein test 12334 - wir benötigen noch 1 mal Ketchup
    Wird mit

    VB.NET-Quellcode

    1. For Each BadWord in ListOfBadWords
    2. TextBox1.Text = TextBox1.Text.Replace(BadWord, "")
    3. Next

    korrekt abgearbeitet. Ich kann das Problem nicht ermitteln. Mach mal einen Haltepunkt bei Zeile TextBox1.Text = TextBox1.Text.Replace(BadWord, "") und lass Dir in jedem Durchlauf das jeweils aktuelle bad word. Ich bekomm da die oben in der Liste genannten Wörter angezeigt und der Text wird wie gewünscht geändert. Welche bad-word-list hast Du? Mit dem Importcode aus Post#2 (Dim ListOfBadWords = IO.File.ReadAllLines("BadWordList.txt").ToList) wird ja jede Zeile als ein bad word erkannt. Aber eben keine Teile einer jeden Zeile. Nur der komplette Zeileninhalt ist so als Treffer vorgemerkt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Quellcode

    1. Dim ListOfBadWords = IO.File.ReadAllLines("BadWordList.txt").ToList
    <<< das war der Magic-Code.

    Hatte es so eingelesen:

    Quellcode

    1. Dim fileReader As String
    2. fileReader = My.Computer.FileSystem.ReadAllText("Wortliste.txt", System.Text.Encoding.Default)


    da war es so komisch!

    Danke Danke!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VBisMine“ ()

    Bitte bitte bitte aktiviere Option Strict On !
    Visual Studio - Empfohlene Einstellungen

    ... und vergiss den My Namespace !
    Böses aus VB6/VB2003 - und die richtigen VB.NET-Alternativen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FormFollowsFunction“ ()

    VBisMine schrieb:

    das war es so komisch!
    Der Unterschied ist wahrscheinlich der, dass Du einmal ReadAllText und einmal ReadAllLines (Text <=> Lines) aufrufst.
    Mach das gleich und die Nachbarin redet wieder mit Dir. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!