Textdatein nach Schlagwort am Zeilenanfang durchsuchen

  • VB.NET

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

    Ok gerne, 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.
    es können mal mehr oder weniger Leerzeichen 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 schlagwort zusammen in der Datei steht.

    VB.NET-Quellcode

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


    Funktioniert soweit wie er soll der Code.

    Nur gerne hätte ich dass die Variationen von verschiedenen gesetzten leerzeichen auch berücksichtigt werden.
    jetzt ging das prg auch einmal kurz auf Störung, aber nur einmal jetzt 10 mal in folge funktioniert keine ahnung warum.

    jedenfalls darum geht es.
    Hallo
    Dieser Code bringt dich vielleicht etwas weiter.

    laBELTEXT = wort welches du suchst (hier steht es in der Textbox)



    VB.NET-Quellcode

    1. Dim laBELTEXT =richTextbox.Text
    2. Dim Line() As String = IO.File.ReadAllLines(dein Pfad, System.Text.Encoding.Default)
    3. If Line.Contains(laBELTEXT) Then
    4. "Dein befehl falls es das Wort beinhaltet"
    5. Else
    6. "Dein befehl falls es das Wort nicht beinhaltet, hier wird es einfach hinein geschrieben..."
    7. Dim text As String = laBELTEXT
    8. File.AppendAllText(fullPathff, text & vbCrLf & "", Encoding.Default)
    9. End If
    10. Me.Close()
    11. End Sub



    lg guzu
    Ich habe deinen als letztes geposteten code mal leicht überarbeitet.
    Kommentare beziehen sich auf Zeile darunter.:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DeineSub()
    2. 'Laß den "Try Catch" Block weg, der verschluckt nur Fehlermeldungen und verhindert effektives Debugging !
    3. ' "txtsuchenVS.TextLength" ist schon ein Integer, da muß nicht noch hin und her konvertiert werden. ;)
    4. If txtsuchenVS.TextLength = 4 Then
    5. ListBox21.Items.Clear()
    6. Dim Pfad21 As String = ("Pfadprg21")
    7. Dim TextSuche21 As ReadOnlyCollection(Of String)
    8. ' "vbCrLf" ist VB-Classic Kompatibilitätskram aus dem Microsoft.VisualBasic Namespace und zu vermeiden,
    9. ' nutze stattdessen das VB.Net Äquivalents
    10. ' Zum Verknüpfen von Strings, nutze "& (Und)", nicht "+ (Plus)", logischerweise willst du die Strings ja aneinander fügen und nicht zusammen zählen.
    11. Dim prg21 As String = Environment.NewLine & "75 " & txtsuchenVS.Text
    12. TextSuche21 = My.Computer.FileSystem.FindInFiles(Pfad21, prg21, True, FileIO.SearchOption.SearchAllSubDirectories, "*.dat")
    13. For Each Suche21 In TextSuche21
    14. Dim Ordner21 As String = IO.Path.GetFileName(Suche21)
    15. ListBox21.Items.Add(Ordner21.Replace(".dat", ""))
    16. Next
    17. Else
    18. ' Auch "MsgBox" ist im Microsoft.VisualBasic Namespace beheimatet, pfuiii ! :D
    19. MessageBox.Show("Es müssen 4 Zahlen eingeben werden.", "Fehler", MessageBoxButtons.OK)
    20. End If
    21. End Sub


    Um Den Anfang eines Strings zu überprüfen, nutze die String.StartsWith Methode.

    Allgemein ist zu sagen, daß du wichtige Ratschläge nicht ignorieren solltest (z.B. bezüglich Try Catch) und erstmal ein paar wichtige Dinge erledigen solltest !
    Und bitte formatiere code in Zukunft ordentlich !
    Nur ganze Methoden und nur die, welche zur konkreten Problemstellung gehören !
    Unnötige Leerzeilen weglassen !
    Darauf achten, daß die Einrückung erhalten bleibt !

    @ guzu Bleib doch lieber erst mal bei deinen "Baustellen", auch wenn es lieb gemeint ist, dein code ist eher kontraproduktiv. :whistling:
    Hallo

    VB.NET-Quellcode

    1. Private Sub btnsuchenVS_Click(sender As Object, e As EventArgs) Handles btnsuchenVS.Click
    2. ListBox21.Items.Clear()
    3. If txtsuchenVS.TextLength = 4 Then
    4. Dim Pfad21 As String = (Pfadprg21)
    5. Dim TextSuche21 As ReadOnlyCollection(Of String)
    6. Dim prg21 As String = Environment.NewLine & "75 " & txtsuchenVS.Text
    7. TextSuche21 = My.Computer.FileSystem.FindInFiles(Pfad21, prg21, 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. Else
    13. MessageBox.Show("Es müssen 4 Zahlen eingeben werden.", "Fehler", MessageBoxButtons.OK)
    14. End If


    so sieht das gute Stück jetzt aus. Funktioniert schon ne Ecke besser. Er listet schonmal nur das auf was wirklich am anfang mit 75 startet. nicht mitten im Text.
    jetzt kann es natürlich mal vorkommen dass nicht sofort ein Zeilenumbruch ist sondern das erst ein Leerzeichen75LeerzeichenSchlagwort steht. also

    VB.NET-Quellcode

    1. Dim prg21 As String = Environment.NewLine & "75 " & txtsuchenVS.Text
    2. Dim prg21 As String = " " & Environment.NewLine & "75 " & txtsuchenVS.Text
    3. Dim prg21 As String = " " & Environment.NewLine & "75 " & txtsuchenVS.Text

    also dass ich quasie diese möglichkeit auch abfrage mit Unterschiedlich gesetzten Leerzeichen in der Zeile.
    hab es mit .Trimm nicht hinbekommen. jemand nen Vorschlag wie ich das löse?

    danke schonmal...

    Gottric schrieb:

    sondern das erst ein Leerzeichen75LeerzeichenSchlagwort steht
    Also

    VB.NET-Quellcode

    1. Dim prg21 As String = Environment.NewLine & " " & "75 " & txtsuchenVS.Text
    usw.
    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!
    hab ich versucht. aber er stellt mir kein Leerzeichen vor die 75.
    ich versuchs mal wieder

    danke

    edit:

    VB.NET-Quellcode

    1. Dim prg21 As String = Environment.NewLine & "75 " & txtsuchenVS.Text
    2. Dim prg21 As String = Environment.NewLine & " " & "75 " & txtsuchenVS.Text


    so kann es ja nicht gehen, muss ich dann nen neuen string anlegen für alle konstellationen an denen die Leerzeichen stehen könnten?
    das muss doch einfacher gehen.


    Gottric schrieb:

    so kann es ja nicht gehen
    Dann benenne den zweiten prg22 oder mach Dir ein Array mit allen Möglichkeiten, über die Du dann mit ner Schleife iterieren kannst.
    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!

    RodFromGermany schrieb:

    ... oder mach Dir ein Array mit allen Möglichkeiten, über die Du dann mit ner Schleife iterieren kannst.

    Das hört sich komplizierter an, als es ist.

    VB.NET-Quellcode

    1. Private Sub YourSub()
    2. 'Damit sich nicht übermäßig Spaghetticode entsteht, habe ich die benötigten Einzelteile, in Variablen gepackt.
    3. Dim newLine As String = Environment.NewLine
    4. Dim blank As String = " "
    5. Dim number As String = "75"
    6. ' Das Array wird mit "As String()" deklariert und gleich eine Instanz erzeugt.
    7. ' In den geschweiften Klammern werden die einzelnen Strings, durch Kommata getrennt, hinzugefügt.
    8. Dim strArray As String() = {newLine & number & blank, newLine & blank & number}
    9. ' Jetzt kann das Array durchlaufen werden (iterieren).
    10. For Each itmStr As String In strArray
    11. ' Mach was mit "str".
    12. MessageBox.Show("""" & itmStr & """")
    13. Next
    14. End Sub

    @Gottric
    Ich täte es so versuchen:

    VB.NET-Quellcode

    1. Dim fInfo = New IO.DirectoryInfo("c:\Temp").GetFiles("*.dat", IO.SearchOption.AllDirectories) 'alle Dateien auflisten
    2. For Each fi In fInfo 'alle Dateien durchsuchen
    3. For Each line In IO.File.ReadLines(fi.FullName) ' alle Zeilen jeder Datei ansehen
    4. Dim parts = line.Split(New Char() {}, StringSplitOptions.RemoveEmptyEntries)
    5. If parts.Length = 0 Then Continue For 'Leerzeilen überspringen
    6. If parts(0) = "75" Then 'den variablen Beginn jeder Zeile testen
    7. ListBox21.Items.Add(fi.Name.Replace(fi.Extension, "")) 'Filenamen auflisten
    8. Exit For 'bei Fund Schleife verlassen
    9. End If
    10. Next
    11. Next
    Ist aber jetzt getestet...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VB1963“ ()

    Also der erste habe ich angepasst und funktioniert. Ich hab ja Nachtschicht, bin über Hand online. Deswegen kann ich nicht posten wie ich es gemacht habe.
    Probiere deinen jetzt auch nochmal aus. Gebe dann Rückmeldung. Danke euch...

    Edit:
    Guten tag miteinander,

    Also der Code sieht jetzt folgendermaßen aus:

    VB.NET-Quellcode

    1. Dim fInfo22 = New IO.DirectoryInfo(Pfadprg22).GetFiles("*.dat", IO.SearchOption.AllDirectories)
    2. For Each fi22 In fInfo22
    3. For Each line In IO.File.ReadAllLines(fi22.FullName)
    4. line = line.Replace(" ", "")
    5. If line.StartsWith("75" & txtsuchenVS.Text) Then
    6. ListBox22.Items.Add(fi22.Name.Replace(fi22.Extension, ""))
    7. Exit For
    8. End If
    9. Next

    Ich hab mich für die Lösung von Vb 1963 entschieden da diese egal wo die 75 steht, also nach wieviel leerzeichen auch immer, mir die Datei richtig anzeigt und alles andere ignoriert er funktioniert auch, aber nur auf meinem Laptop. wenn ich das ganz auf dem rechner laufen lasse schmiert mein Programm ab, keine Rückmeldung und muss dann geschlossen werden. Die Zeit die es braucht auf meinen rechner ist auch sehr lange, aber sind ja auch 150000 textdateien die er durchsuchen muss, deswegen dachte ich das sei normal.
    Ich habe option Strict on ausgemacht da er mir zwar einen Fehler anzeigt, aber das Programm trotzdem läuft.

    VB.NET-Quellcode

    1. Try
    2. Dim datei21 As String = CType(ListBox21.SelectedItem, String)
    3. datei21 = ListBox21.SelectedItem.replace("prg_", "").replace("_", "")
    4. Select Case True
    5. Case CInt(datei21) = 0
    6. lblVS.Text = "Ausgewähltes Prg. "
    7. Case CInt(datei21) > 0
    8. For Each Line As String In IO.File.ReadAllLines(Pfadprg21 + "prg__dir.dat", System.Text.Encoding.Default)
    9. Line = Line.TrimStart
    10. If datei21 = Regex.Matches(Line, "[0-9]{0,}")(0).ToString Then
    11. lblVS.Text = Line.Replace(datei21, "Roboter 2.1:")
    12. End If
    13. Next
    14. End Select

    fehler liegt hier:

    VB.NET-Quellcode

    1. Dim datei21 As String = CType(ListBox21.SelectedItem, String)

    Das ist die einzige möglichkeit die mir erklären könnte warum es abschmiert auf dem Rechner auf dem es eigentlich laufen soll.
    Wobei es schon beim Suchen der Dateien für die Listbox aufhängt, es kommt garnicht soweit dass ich ein Item anklicken könnte.
    Ist es möglich da die Datein die er durchsuchen, nciht auf der Festplatte vom Rehcner sondern auf dem Netzwerk liegen. (Pfade stimmen, habe ich kontorlliert.)
    jemand ne idee? oder ist der code den ich mir da zusammengeschreiben habe vielleicht schlecht strukturiert oder sowas dass er deswegen sich aufhängt?

    Es sind insgesamt 15 verschiedene Ordner in denen jeweils ca. 10000 Dateien sind, verteilt auf 8 verschiedene Netzwerke.
    Das ist das Spektrum was durchsucht werden muss.

    Ist das vielleicht zuviel für mein kleines Tool?

    jetzt schon danke für eure Hilfe.

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

    Du hast ja immer noch einen Try Catch Block drinn ! :rolleyes:

    Gottric schrieb:

    VB.NET-Quellcode

    1. Dim datei21 As String = CType(ListBox21.SelectedItem, String)

    CType konvertiert den String aus der ListBox zu Integer, datei21 ist aber als String deklariert. <- Quatsch mit Soße :D

    ListBox21.SelectedItem ist vom Datentyp Object, es reicht ein einfaches .ToString.

    Pasta schrieb:

    Und bitte formatiere code in Zukunft ordentlich !
    Nur ganze Methoden und nur die, welche zur konkreten Problemstellung gehören !
    Unnötige Leerzeilen weglassen !
    Darauf achten, daß die Einrückung erhalten bleibt !

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

    Pasta schrieb:

    CType konvertiert den String aus der ListBox zu Integer
    What? Warum zu ​Integer? Und in der ListBox ist damit ein Object. Jedenfalls tut es hier auch ein ​ToString, no ​CType needed.

    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 :!:
    Wieso? Die Aussage hast Du doch getätigt?

    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 :!:
    ... und ich habe Deinen Kommentar beanstandet. Wo wird da was zu ​Integer?

    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 :!: