Textdatein nach Schlagwort am Zeilenanfang durchsuchen

  • VB.NET

Es gibt 84 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    Textdatein nach Schlagwort am Zeilenanfang durchsuchen

    Hallo liebe VB-Gemeinde,

    ich stehe vor einem kleinen Problem. Kurz Erklärung, ich habe eine Form erstellt auf der mehrere Listboxen sind. Ich habe ein Textfeld in den ich einen Begriff eingebe und er sucht mir 18 Ordner mit je 10000 Textdatein nach dem eingegebenen Begriff durch und schreibt mir in die Listboxen wo sich das wort befindet. Ich hab reinprogrammiert dass ich die Textdatei aus der Listbox raus öffnene kann. alles Top, aber jetzt zur Sache:

    Ich möchte dass er mir nur die Textdateien in die Listboxen schreibt in der eine "75" am Anfang der Zeile steht und dann der Suchbegriff. Momentan kann der Begriff überall stehen und es wird reingeladen in die Listboxen.

    Ich habe mir StartsWith angesehen aber es will nicht klappen.

    VB.NET-Quellcode

    1. Private Sub btnsuchenVS_Click(sender As Object, e As EventArgs) Handles btnsuchenVS.Click
    2. Try
    3. ListBox21.Items.Clear()
    4. Dim Pfad21 As String = (Pfadprg21)
    5. Dim TextSuche21 As ReadOnlyCollection(Of String)
    6. TextSuche21 = My.Computer.FileSystem.FindInFiles(Pfad21, txtsuchenVS.Text, True, FileIO.SearchOption.SearchAllSubDirectories, "*.dat")
    7. For Each Suche21 In TextSuche21
    8. Dim Ordner21 As String = IO.Path.GetFileName(Suche21)
    9. ListBox21.Items.Add(Ordner21.Replace(".dat", ""))
    10. Next


    Kann es sein dass ich StartsWith nicht benutzten kann bei ReadOnlyCollection oder mit FindInFiles?
    Hat jemand ne Lösung?

    Danke schonmal...

    Gottric schrieb:

    am Anfang der Zeile
    Da musst Du schon selbst was machen.
    Gehe alle Dateien durch und lies jeweils den Beginn jeder Zeile einer solchen Datei. Hast Du Deinen Zeilenstart gefunden, tue das, was getan werden muss:

    VB.NET-Quellcode

    1. Dim fis() = New IO.DirectoryInfo("c:\Temp").GetFiles("*.txt", IO.SearchOption.AllDirectories) ' alle Dateien auflisten
    2. For Each fi In fis ' alle Dateien durchmustern
    3. For Each line As String In IO.File.ReadLines(fi.FullName) ' alle Zeilen jeder Datei ansehen
    4. If line.ToLower().StartsWith("bla") Then ' den Beginn jeder Zeile testen
    5. 'Do it
    6. End If
    7. Next
    8. Next
    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!
    Ok danke, ich versuch es mal umzusetzten.

    Edit:

    VB.NET-Quellcode

    1. Try
    2. ListBox21.Items.Clear()
    3. Dim Pfad21 As String = (Pfadprg21)
    4. Dim TextSuche21 As ReadOnlyCollection(Of String)
    5. Dim fis() = New IO.DirectoryInfo(Pfad21).GetFiles("*.dat", IO.SearchOption.AllDirectories) ' alle Dateien auflisten
    6. For Each fi In fis ' alle Dateien durchmustern
    7. For Each line As String In IO.File.ReadAllLines(fi.FullName) ' alle Zeilen jeder Datei ansehen
    8. If line.ToLower().StartsWith("75") Then ' den Beginn jeder Zeile testen
    9. line = line.Replace(" ", "")
    10. TextSuche21 = My.Computer.FileSystem.FindInFiles(Pfad21, txtsuchenVS.Text, True, FileIO.SearchOption.SearchAllSubDirectories, "*.dat")
    11. For Each Suche21 In TextSuche21
    12. Dim Ordner21 As String = IO.Path.GetFileName(Suche21)
    13. ListBox21.Items.Add(Ordner21.Replace(".dat", ""))
    14. Next
    15. End If
    16. Next
    17. Next


    irgendwie steh ich auf dem Schlauch.
    was mach ich denn Falsch? Er zeigt mir keinen Fehler an in Visual Studio.

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

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. For Each line As String In IO.File.ReadLines(fi.FullName) ' alle Zeilen jeder Datei ansehen

    Gottric schrieb:

    VB.NET-Quellcode

    1. For Each line As String In IO.File.ReadAllLines(fi.FullName) ' alle Zeilen jeder Datei ansehen
    Findest Du den Unterschied?
    Warum fragst Du nicht, wenn Du den Code nicht verstehst?
    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!
    Ne, ich seh keinen Unterschied da.

    Der pc arbeitet ja auch bei dem Code, aber irgendwann hängt er sich auf.

    Warum die try catch raus? Das brauch ich doch um eventuell auftretende Fehler abzufangen.

    edit:
    was meinst du mit Haltepunkt?

    Edit :
    Das da kein Unterschied ist liegt daran dass es 1 zu 1 kopiert ist.
    ich hab ja versucht den Code anzupassen. Aber ich weiß nicht genau wie. Hab paar Sachen ausprobiert aber klappt nicht.

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

    @Gottric
    Mit Try / Catch verschleierst Du Fehler statt sie zu erkennen.
    ReadAllLines liest die gesamte Datei in den RAM. ReadLines liest lediglich die aktuelle Zeile der Datei in den RAM, ist also ressourcenschonend.
    Haltepunkt: Gugst Du hier.
    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!
    Ich verstehe das jetzt so dass ich die Dateien also alle öffnen und reinladen muss? Das ist doch viel zu viel für ne Listbox denke ich mir.
    so wie ich den Code hatte liest er nur alle datein und öffnet sie nicht wirklich oder?
    Oder ist es sonst nich tmöglich den Zeilenanfang abzufragen?

    also einfach wie mein Code ist nur dass er mir nur die Dateinamen in der Listbox auflistet in der das wort nach einer 75 am Anfang einer Zeile steht.
    Es können immer mal 1 oder 2 Leerzeichen dazwischen sein. aebr dafür habe ich ja line.trim

    gibt es eine möglichkeit das so zu programmieren?

    Gottric schrieb:

    Ich verstehe das jetzt so
    Das hast Du falsch verstanden.
    Deine Lösung liest die komplette Datei ein.
    Meine Lösung liest jede Zeile einzeln ein.
    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!
    Ich will ja nicht den Inhalt der Datei haben, ich will nur wissen welche datei das ist in der am "75" am Anfang einer Zeile steht gefolgt von dem Schlagwort, er schreibt mir ja nur den Namen der Datei in die Listbox.

    Oder muss ich die Datei öffnen um rauszufinden ob eine "75" am Anfang einer Zeile steht gefolgt von dem Schlagwort?
    Wusste ich nicht. Vieleicht versteh ich ja auch was falsch. mit meinem jetzigen Code öffne ich die Datei ja nicht oder?

    VB.NET-Quellcode

    1. Private Sub btnsuchenVS_Click(sender As Object, e As EventArgs) Handles btnsuchenVS.Click
    2. Try
    3. If CInt(txtsuchenVS.TextLength.ToString()) = 4 Then
    4. ListBox21.Items.Clear()
    5. Dim Pfad21 As String = (Pfadprg21)
    6. Dim TextSuche21 As ReadOnlyCollection(Of String)
    7. TextSuche21 = My.Computer.FileSystem.FindInFiles(Pfad21, txtsuchenVS.Text, True, FileIO.SearchOption.SearchAllSubDirectories, "*.dat")
    8. For Each Suche21 In TextSuche21
    9. Dim Ordner21 As String = IO.Path.GetFileName(Suche21)
    10. ListBox21.Items.Add(Ordner21.Replace(".dat", ""))
    11. Next
    12. Next
    13. Else
    14. MsgBox("Es müssen 4 Zahlen eingeben werden.", MsgBoxStyle.Critical, "Fehler")
    15. End If
    16. Catch ex As Exception
    17. MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler")
    18. End Try
    19. End Sub


    also durchsuchen geht ohne sie zu öffnen aber am Zeilenanfang suchen muss das gemacht werden?
    msdn.microsoft.com/de-de/library/s2tte0y1(v=vs.110).aspx

    Natürlich öffnet ReadAllLines die Datei genauso wie ReadLines.

    File.ReadAllLines-Methode (String)

    .NET Framework (current version)

    Öffnet eine Textdatei, liest alle Zeilen der Datei und schließt dann die Datei.



    Ein Buch wirst du ja auch nicht durchsuchen/lesen können ohne es zu öffnen ;)

    Mfg Mika

    Gottric schrieb:

    mit meinem jetzigen Code öffne ich die Datei ja nicht oder?
    Schaue dir beide Verweise unten einmal genau durch:
    msdn.microsoft.com/de-de/library/s2tte0y1(v=vs.110).aspx
    msdn.microsoft.com/de-de/library/dd383503(v=vs.110).aspx

    MSDN schrieb:

    Die ReadLines und ReadAllLines Methoden unterscheiden sich wie folgt: bei Verwendung ReadLines, können Sie anfangen, die Auflistung von Zeichenfolgen aufzulisten, bevor die ganze Auflistung zurückgegeben wird; bei Verwendung ReadAllLines, Sie müssen warten, für das gesamte Array von Zeichenfolgen zurückgegeben werden, bevor Sie das Array zugreifen können. Daher, wenn Sie arbeiten mit sehr großen Dateien ReadLines kann effizienter sein.
    Es wird immer eine Datei geöffnet...
    Nett dass ihr mir alle antwortet. aber irgendwie alles bisschen viel, ich muss dann wohl noch einiges lesen dazu. Trotzdem danke, ich versuch mal dass ich es irgendwie hinbekomme. wenn nicht ist das dann halt so, danke euch...

    edit:
    ich dachte es sei keine so große sache.

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

    Wenn du unbedingt bei FindInFiles bleiben willst, kannst du auch nach Zeilenumbruch & "75" suchen.
    Das funktioniert aber nicht in der ersten Zeile, weil da kein Zeilenumbruch voran gestellt ist.
    Auch FindInFiles öffnet die Dateien, um sie zu durchsuchen.

    Aber beide Methoden zu verwenden ist Blödsinn.
    Entweder Rod's Methode oder FindInFiles.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    sehr gute idee, daran hab ich nicht gedacht. danke
    das versuch ich mal.

    VB.NET-Quellcode

    1. Dim prg21 As String = (vbCrLf) + "75 " + txtsuchenVS.Text
    2. 'prg21.TrimStart()
    3. 'prg21 = prg21.Replace(" ", "")
    4. TextSuche21 = My.Computer.FileSystem.FindInFiles(Pfad21, prg21, True, FileIO.SearchOption.SearchAllSubDirectories, "*.dat")
    5. For Each Suche21 In TextSuche21
    6. Dim Ordner21 As String = IO.Path.GetFileName(Suche21)
    7. ListBox21.Items.Add(Ordner21.Replace(".dat", ""))


    funktioniert tip-top, aber leider nur in dieser constellation.
    Ich hätte gerne mehr möglichkeiten, zum beispiel

    VB.NET-Quellcode

    1. Dim prg21 As String = " " + (vbCrLf) + "75 " + txtsuchenVS.Text

    also mal mehr oder weniger zeichen dazwischen dass wenn mal ne variation davon vorkommen sollte er mir die trotzdem anzeigt. es können nur leerzeichen verschieden gesetzt sein, es gilt zu sagen dass wenn die Suche vorkommt nur die 75 mit dem schalgwort zusammen in der Datei steht.


    wie man sieht hab ich mal versucht mit trimstart und replace rumgespielt, aber klappt nicht ganz.

    jemand noch ne idee?

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

    Gottric schrieb:

    also mal mehr oder weniger zeichen
    Poste mal eine vollständige und belastbare Aufgabenstellung.
    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!