Textdatei durchsuchen + Schnellsuche

  • VB.NET

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

    Textdatei durchsuchen + Schnellsuche

    Hallo VB Forum,
    ich bin noch total unerfahren im Umgang mit Visual Basic. Jedoch möchte ich mich mehr damit beschäftigen. Meine erste Herausforderung ist es, ein "Tool" zu erstellen dass eine Textdatei (in meinem Fall .lua) durchsucht. Wenn ich "Hallo" in die Suchleiste schreibe, sollen mir alle Sätze angezeigt werden in denen "Hallo" vorhanden ist. Alle anderen Sätze werden ausgeblendet. Dies soll aber passieren ohne den "Suchen" Knopf zu drücken. Ein gutes Beispiel ist das Tool von "skill2exe". Ein Spiel besitzt Fragen im Spiel, welche man in dieses Tool einfügen kann. Diese lassen sich dann per Sucheleiste abfragen. Ich möchte genau so etwas erstellen. Es sieht im ersten moment sehr einfach aus, aber da ich total unerfahren bin fällt mir das alles total schwer. Würde es aber gerne hinbekommen da das Tool auch nützlich für mich wäre:)

    Danke für hilfreiche Antworten.
    LG, Mikkkkkke :whistling:
    Und wo genau kommst Du jetzt nicht weiter?
    Dein Name scheint mir btw laut Regeln nicht sehr legal.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich finde im Internet keine hilfreichen Themen. Ich weiß nicht wie ich eine Textdatei so durchsuchen kann dass mir nur die Sätze angezeigt werden mit "Hallo" im Inhalt. Alle anderen sollen nicht angezeigt werden. Das selbe Problem mit der Schnellsuche. Wie kann ich einstellen dass es schon bei der Eingabe sucht.
    Und das mit dem Benutzernamen war mir bisher unbekannt. Das war nicht beabsichtigt.

    LG, Mikkkkkke

    Mikkkkkke schrieb:

    Ich weiß nicht wie ich eine Textdatei so durchsuchen kann dass mir nur die Sätze angezeigt werden mit "Hallo" im Inhalt.

    Du liest deine Textdatei ein (sind die Sätze jeweils in einer neuen Zeile? Dann einfach mit .ReadLine()).
    msdn.microsoft.com/de-de/libra…r.readline(v=vs.110).aspx
    Prüfst bei jedem Satz, ob er das Gesuchte enthält, wenn ja, fügst du ihn einer MyList As New List(Of String) hinzu.
    Dann zeigst du sie einfach in einer ListBox an (ListBox.Datasource=MyList).

    Mikkkkkke schrieb:

    Wie kann ich einstellen dass es schon bei der Eingabe sucht.

    Den richtigen Event nehmen und da die Suchfunktion starten.
    Danke WhitePage für die "hilfreiche" Antwort. Ich kann mit vielen Begriffen wenig anfangen. Kannst du mir Schritt für Schritt erklären, welche Tools ich in der Toolbox verwenden muss? Ich versuche mich wirklich sehr in das Programm einzuarbeiten, jedoch fällt es mir etwas schwer.

    LG, Mikkkkkke
    Ich hoffe mal du hast bereits in deiner Form eine RichTextBox und eine Textbox

    Zum Einlesen Einer Text Datei:

    VB.NET-Quellcode

    1. RichTextBox1.Text = My.Computer.FileSystem.ReadAllText("PFARD ZUR DATEI ZB: C:\test.lua")


    Mikkkkkke schrieb:

    Dies soll aber passieren ohne den "Suchen" Knopf zu drücken

    Nutze Dazu entweder das .TextChanged Event deiner TextBox oder die unschönere Variante über einen Timer

    Zum Suchen und Makieren:

    VB.NET-Quellcode

    1. Dim sucheNach As String = textbox1.text
    2. Dim StartIndex As Int32 = 0
    3. While richTextBox1.Text.IndexOf(sucheNach, StartIndex) >= 0
    4. richTextBox1.SelectionStart = richTextBox1.Text.IndexOf(sucheNach, StartIndex)
    5. richTextBox1.SelectionLength = sucheNach.Length
    6. richTextBox1.SelectionColor = Color.Blue
    7. StartIndex = richTextBox1.Text.IndexOf(sucheNach, StartIndex) + sucheNach.Length
    8. End While

    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Ruerte“ ()

    Ruerte schrieb:

    Zum Einlesen Einer Text Datei:
    VB.NET-Quellcode

    VB.NET-Quellcode

    1. RichTextBox1.Text = My.Computer.FileSystem.ReadAllText("PFARD ZUR DATEI ZB: C:\test.lua")


    FALSCH!!
    Entweder StreamReader oder System.IO.ReadAllText
    msdn.microsoft.com/de-de/library/ms143368(v=vs.110).aspx

    Ruerte schrieb:

    VB.NET-Quellcode

    1. '\\ Als Timer (du muust dann aber entweder im Load Event deiner Form den Timer Starten oder durch einen Button timer1.start)
    2. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    3. '\\ was nach eingabe eines textes passiren soll
    4. End Sub


    FALSCH!! Er braucht keinen Timer.

    @Mikkkkkke
    Wenn du gar nicht programmieren kannst, dann solltest du vielleicht erst mal ein Buch dazu lesen und lernen:
    Hier ist ein kostenloses Buch

    Ansonsten habe ich schon gesagt, dein Programm benötigt nur wenige Codezeilen. Allerdings hast du mir meine Fragen nicht beantwortet (ob die Sätze in einzelnen Zeilen sind oder nicht).
    1. FileSystem.ReadAllText ja ist nicht optimal aber ist in 2sic. dahin geklatscht
    2.

    Ruerte schrieb:

    oder die unschönere Variante über einen Timer
    Warum mengelst Du das an? hab ihn lediglich darauf hingewiesen das es auch über einen Timer gehen "würde"
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Das mit dem Einlesen einer Textdatei habe ich nun geschafft. Wenn ich in die "RichTextBox" gehe und einen Buchstaben drücke wird mir die Liste angezeigt. Ich stelle mich etwas blöd an wenn ich ehrlich bin.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
    3. RichTextBox1.Text = My.Computer.FileSystem.ReadAllText("D:\oxquiz.lua")
    4. End Sub
    5. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    6. Dim sucheNach As String = TextBox1.Text
    7. Dim StartIndex As Int32 = 0
    8. While RichTextBox1.Text.IndexOf(sucheNach, StartIndex) >= 0
    9. RichTextBox1.SelectionStart = RichTextBox1.Text.IndexOf(sucheNach, StartIndex)
    10. RichTextBox1.SelectionLength = sucheNach.Length
    11. RichTextBox1.SelectionColor = Color.Blue
    12. StartIndex = RichTextBox1.Text.IndexOf(sucheNach, StartIndex) + sucheNach.Length
    13. End While
    14. End Sub
    15. End Class
    Weil es Schwachsinn ist. Und wenn Du das schon selbst weißt, dann weise gar nicht drauf hin. ;)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    VB.NET-Quellcode

    1. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    2. Dim sucheNach As String = TextBox1.Text
    3. Dim StartIndex As Int32 = 0
    4. '\\ Zurücksetzen SelectColor (Farbmakirungen)
    5. RichTextBox1.SelectionStart = 0
    6. RichTextBox1.SelectionLength = RichTextBox1.Text.Length
    7. RichTextBox1.SelectionColor = Color.Black
    8. ' \\Suchen des zu Suchenden Wortes in RichTextBox
    9. If TextBox1.Text <> "" Then
    10. While RichTextBox1.Text.IndexOf(sucheNach, StartIndex) >= 0
    11. RichTextBox1.SelectionStart = RichTextBox1.Text.IndexOf(sucheNach, StartIndex)
    12. RichTextBox1.SelectionLength = sucheNach.Length
    13. RichTextBox1.SelectionColor = Color.Blue
    14. StartIndex = RichTextBox1.Text.IndexOf(sucheNach, StartIndex) + sucheNach.Length
    15. End While
    16. End If
    17. End Sub


    Solltest du nun in der TextBox zb. "s" schreiben werden alle "s" in der RichTextBox Blau angezeigt RichTextBox1.SelectionColor = Color.Blue
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Richtig WhitePage, ich wollte dass es sofort durchsucht. Ich kenne mich zu gut wie überhaupt nicht aus und vertraue deshalb auf euren Rat und versuche alle Handlungen zu verstehen. Was muss ich an meinem Quellcode jetzt ändern? Ich möchte sobald ich einen Text in die Suchleiste eingebe danach suchen,

    Mikkkkkke schrieb:

    sobald ich einen Text in die Suchleiste eingebe
    Gönn Dir ruhig einen Such-Button, senn wenn Du das Wort "weiter" suchen willst, startet die Suche bereits bei "w" und wird dann bei "we" geändert usw.
    Der Aufwand, so was dynamisch und sicher zu machen ist doch unverhältnismäßig hoch.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Upps hab ich überlesen... :D
    Wenn du Sie sofort durchsuchen willst müsstest du deine Textinhalt am besten in eine Variabel speichern.

    Dabei ist aber die Frage wie schaut deine Datei aus:

    HTML-Quellcode

    1. satz 1.
    2. satz 2.
    3. satz 3.

    oder z.b.

    HTML-Quellcode

    1. satz 1. satz 2. satz 3.


    RodFromGermany schrieb:

    Der Aufwand, so was dynamisch

    Muss ich nicht nachvollziehen können oder?
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

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

    Du schreibst eine Sub, die einen Text nach einem Wort durchsucht.

    VB.NET-Quellcode

    1. Private Sub Search(ByVal s As String, ByVal key As String)


    Diese rufst du aus dem TextChanged-Event auf:

    VB.NET-Quellcode

    1. Dim key=TextBox1.Text
    2. Search(path,key)


    Ich denke, es würde reichen, wenn du die Datei einmal bei FormLoad-Event einliest, sie wird sich wohl nicht verändern, oder? Dann speicherst du den Inhalt in einer String-Variable, die du global unter "Public Class Form1" deklarierst. Dim MyText As String

    In der Sub wirst du einfach den String jedes Mal neu durchsuchen.

    Meine Frage, die ich schon zwei Mal gestellt habe (ob die Sätze in der Datei in eigenen Zeilen sind oder nicht), hast du leider immer noch nicht beantwortet, deswegen kann ich nicht weiter helfen.
    RodFromGermany, es darf ruhig so sein dass es nach jedem Buchstaben neu sucht. Wenn 5 Sätze mit " Gefällt dir" anfangen, werden mir eben alle 5 angezeigt. Auch sowas könnte ich sehr gut gebrauchen.

    Die Textdatei ist folgendermaßen aufgebaut:

    1.Satz
    2.Satz
    3.Satz

    jedoch steht vor den Sätzen noch ein Befehl mit "add_"
    Gibt es eine möglichkeit dies auszublenden,sodass nur der Text da steht?

    add_"Wie geht es ihnen?"

    zu

    "Wie geht es ihnen?"

    Ich werde ein paar Bilder eines Tools anhängen wenn dies möglich ist)
    Bilder
    • Tool1.png

      1,39 MB, 1.920×1.080, 175 mal angesehen
    • Tool2.png

      1,42 MB, 1.920×1.080, 216 mal angesehen
    dass add_ kannst du ganz einfach durch .replace("add_","") ersetzen bzw. entfernen

    EDIT: erinnert mich dank "OX" und der Art der fragen an Metin 2, was bei mir kaputt .__.
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

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

    Dann liest du die Datei mit .ReadLine() in einer Schleife ein.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private lstText As New List(Of String)


    Und in der Schleife machst du nach jedem .ReadLine() dann lstText.Add(satz). So hast du dann alle Sätze aus der Datei einzeln in einer List. Vorher musst du die Sätze beschneiden. Such einfach nach Index vom _ und beschneide den String mit Substring().
    EDIT: Stimmt, kannst auch mit Replace machen (siehe oben).

    Bei der Suche gehst du ebenfalls in der Schleife alle Elemente der List durch (For Each txt in lstText) und prüfst, ob sie das Gesuchte enthalten (If txt.Contains(key)). Wenn ja, fügst du sie einer anderen List(Of String) hinzu, die du am Ende zurückgibst. Dafür musst du Sub in

    VB.NET-Quellcode

    1. Private Function Search (ByVal key As String) As List(Of String)

    umbenennen.

    Im Event dann:

    VB.NET-Quellcode

    1. Dim key=TextBox1.Text
    2. Dim lst = Search(key)
    3. ListBox1.DataSource=lst

    Mikkkkkke schrieb:

    es darf ruhig so sein dass es nach jedem Buchstaben neu sucht. Wenn 5 Sätze mit " Gefällt dir" anfangen
    dann such er
    1. g
    2. ge
    3. gef
    4. gefä
    5. gefäl
    usw. Ist das der Plan?
    @Ruerte Ich denke mal, dass bei einem längeren Text und schnellem Tippen ein Suchvorgang gestartet wird, bevor der letzte abgeschlossen ist.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!