Textdatei auslesen und bestimmte Zeilen mit bestimmten Eigenschaften löschen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Ceytec.

    Textdatei auslesen und bestimmte Zeilen mit bestimmten Eigenschaften löschen

    Hallo liebe Community,


    und zwar habe ich ein Problem. Ich besitze einen Server und habe dort bestimmte LogFiles die Extrem groß sind.
    Und möchte mir dafür ein kleines "FilterTool" basteln.

    Ich habe mit dem ganzen auch bereits angefangen nun weis ich allerdings nicht weiter.
    Ich möchte das man mit einem "Button Click" die vorher ausgelesene TextFile filtert und nur die Zeilen behält die folgende Schlagwörter enthält: "Type" und "Object"
    Alles andere soll gelöscht werden.

    Wie kann ich das realisieren?


    Ich freue mich schon jetzt auf eure Antworten und bedanke mich im voraus das ihr euch Zeit für nehmt.
    Euer Wisiskyline ;)

    EDIT*
    Code bis jetzt:

    Quellcode

    1. ​Private Sub Filename()
    2. OpenFileDialog1.ShowDialog()
    3. path_tb.Text = OpenFileDialog1.FileName
    4. End Sub
    5. Private Sub open_file_Click(sender As Object, e As EventArgs) Handles open_file.Click
    6. Filename()
    7. RichTextBox1.LoadFile(OpenFileDialog1.FileName, RichTextBoxStreamType.PlainText)
    8. End Sub
    9. Sub write()
    10. Dim strFileName As String = path_tb.Text
    11. Dim strValue As String = ""
    12. Dim writer As StreamWriter
    13. Dim enc As System.Text.Encoding
    14. Dim blnAppend As Boolean = False
    15. enc = System.Text.Encoding.ASCII
    16. writer = New StreamWriter(strFileName, blnAppend, enc)
    17. strValue = RichTextBox1.Text
    18. writer.Write(strValue)
    19. writer.Close()
    20. End Sub
    21. Private Sub cmd_save_Click(sender As Object, e As EventArgs) Handles cmd_save.Click
    22. write()
    23. MsgBox("Log File wurde erfolgreich gespeichert!", MsgBoxStyle.Information, "Erfolg!")
    24. End Sub
    25. Private Sub cmd_delete_Click(sender As Object, e As EventArgs) Handles cmd_delete.Click
    26. RichTextBox1.Clear()
    27. MsgBox("Inhalt wurde erfolgreicht gelöscht! (Speichern nicht vergessen!)", MsgBoxStyle.Information, "Erfolg!")
    28. End Sub

    @Wisiskyline Willkommen im Forum. :thumbup:
    Warum do kompliziert? Arbeite zeilenorientiert:

    VB.NET-Quellcode

    1. For Each line in IO.File.ReadLines(NAME_DEINER_DATEI)
    2. If Not ZEILE_WIRD_IGNORIERT Then
    3. IO.File.AppendAllText(NAME_DER_OUTZPUT_DATEI, line & Environment.NewLine)
    4. End If
    5. 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!
    @Wisiskyline: Da muss man zum Glück kein Profi dafür sein. Man liest die Logfile zeilenweise aus. Z.B. mit der For-Schleife, die RFG vorschlägt. Und jede Zeile, die die passenden Begriffe enthält, also nicht ignoriert werden soll (Not ZEILE_WIRD_IGNORIERT, so wie RFG es umschreibt), wird z.B. in eine RichTextBox geschrieben. Oder gerne auch in eine eigene Datei, also auf jeden Fall dorthin, wo man die gewünschten Zeilen haben will.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja ok aber wie genau soll das ganze dann aussehen? @VaporiZed

    so in etwa ?

    Quellcode

    1. For Each line In IO.File.ReadLines(path_tb.Text)
    2. If Not RichTextBox1.Text = "Server: Object" Then
    3. IO.File.AppendAllText(RichTextBox1.Text, line & Environment.NewLine)
    4. End If
    5. Next


    Weil das ganze wirft einen Fehler. Ich glaube ich stelle mich gerade etwas dumm an :/
    Öhm, ja ...
    Zeile 1 liest jede Zeile aus der Datei, die in path_tb.Text drinsteht. Möge dieser Pfad zu einer Datei führen.
    Zeile 2: If Not RichTextBox1.Text = "Server: Object"; n bisken sinnlos, oder? »Wenn der Text der RichTextBox das-und-das ist, dann ...« Nee, eben nicht. Du willst nicht die RTB auswerten, sondern die line aus Zeile 1. Also passend ändern.
    Zeile 3: AppendAllText nimmt laut IntelliSense als ersten Parameter was? Richtig. Ein RTB.Text ist es schon mal nicht. Sondern? Passend ändern und fertig ist der Lack.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Also ich erkläre nochmal kurz wie das Tool funktioniert.
    Es nimmt einer TXT File daher und ließt diese ein. Soweit funktioniert alles bereits.
    Der gesamte Inhalt wird in einer RTB reingeschrieben.
    Dann will ich auf einen Button drücken der Clear LogFile heist und diese bereinigen von unnötigen Zeilen.
    Mit anderen Worten ich verstehe absoult nicht was mit Zeile

    Quellcode

    1. If Not RichTextBox1.Text = "Server: Object" Then
    2. IO.File.AppendAllText(RichTextBox1.Text, line & Environment.NewLine)

    gemeint ist :(


    Hab jetzt das hier gemacht das geht aber auch nicht. Mir würde einfach ein fertiger Codeabschnitt reichen.
    Ich will das einfach nur noch fertig bekommen und meine Logs kürzen :(

    Quellcode

    1. For Each line In IO.File.ReadLines(path_tb.Text)
    2. If Not line = "Server: Then" Then
    3. IO.File.AppendAllText(RichTextBox1, line & Environment.NewLine)
    4. End If
    5. Next

    Wisiskyline schrieb:

    Mit anderen Worten ich verstehe absoult nicht was mit Zeile
    {Quellcode}
    If Not RichTextBox1.Text = "Server: Object" Then
    IO.File.AppendAllText(RichTextBox1.Text, line & Environment.NewLine)
    {/Quellcode}
    gemeint ist

    Diese Zeile ist von Dir, und zwar aus Post#5. Wenn Du nicht weiß, was damit gemeint ist: Ich auch nicht, denn es ist Mus.
    Wenn Du alle Zeilen in einer RTB hast, dann kannst Du diese mit einer For-Schleife durchgehen:

    VB.NET-Quellcode

    1. For Each line in RichTextBox1.Lines

    Danach wird geschaut, was in der Line drinsteht. Wenn der Inhalt ungewollt ist, dann Continue For
    Ich glaube aber nicht, dass

    Wisiskyline schrieb:

    If Not line = "Server: Then" Then
    da passt. Der Anfang bis zum Gleichheitszeichen passt, danach muss wohl ein anderer Suchtext rein.
    Wenn die Line inhaltlich passt, also irgendwo angezeigt werden soll, dann schieb die Line dorthin. Zum Beispiel in eine weitere RTB. Aber IO.File.AppendAllText ist hier ungeeignet. Ich habe das Gefühl, dass Du nicht nachgesehen hast, was der 1. Parameter sein soll, sonst wüsstest Du, dass diese Funktion einen Text in eine Datei schreiben will; und Parameter 1 ist die Zieldatei, weshalb RichTextBox1.Text als Parameter totaler Humbug ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    Danke erstmal für deine Unterstüztung.

    Ich habe jetzt folgende Zeilen:

    Quellcode

    1. ​ For Each line In RichTextBox1.Lines
    2. If Not line = "Server: Object" Then
    3. RichTextBox1.Text = line
    4. End If
    5. Next


    Funktioniert auch. ABER: Es wird mir nur eine Zeile in der RTB ausgegeben. Ich will aber alle Zeilen die mit Server: Object beginnen.
    Ehm ... was tust Du da? Du willst alle Zeilen in der RTB durchgehen. Und was machst Du in Zeile 3? Du überschreibst den kompletten Inhalt der RTB (= Inhalt Deiner LogFile) mit einer Zeile. In Zeile 3 gehört eine andere RTB. Eine zweite. Oder ein ganz anderes CE. Vollkommen egal. Aber nicht die RTB1. Die willst Du auslesen. Aber wenn Du deren Inhalt durch die jetzige Zeile 3 überschreibst, kann das nix werden.

    Wisiskyline schrieb:

    Ich will aber alle Zeilen die mit Server: Object beginnen
    Dann nutz nicht das Gleichheitszeichen in Zeile 2, sondern line.StartsWith(DeinSuchtext)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich versteh's auch nicht, daher ein Beispiel:
    Du liest die Datei in die RTB1 (RichTextBox1) ein.
    Dort steht jetzt z.B. drin:

    1. Zeile: "faselfasel"
    2. Zeile: "Server: Object"
    3. Zeile: "blubb blubb"

    jetzt kommt Dein Code:

    VB.NET-Quellcode

    1. For Each line In RichTextBox1.Lines
    2. If Not line = "Server: Object" Then
    3. RichTextBox1.Text = line
    4. End If
    5. Next

    Codezeile 1: »Gehe jede Zeile in der RTB1 durch und packe den Inhalt einer Zeile in die Variable "line".« => in "line" steht im ersten Schleifendurchgang drin: faselfasel
    Codezeile 2: »Wenn der Inhalt von "line" nicht "Server: Object" ist, dann« ok, da in line "faselfasel" drinsteht, trifft die Bedingung zu.
    Codezeile 3: »Inhalt von RTB1 soll nun Inhalt der Variablen line sein« => der große Fehler! Zuvor stand in der RTB1 korrekterweise "faselfasel", "Server: Object" und "blubb blubb" drin. Aber jetzt ersetzt Du diese drei Zeilen durch den Inhalt von line => in der RTB1 steht nur noch faselfasel drin. Das ist aber nicht das, was Du willst. Daher darf in dieser Zeile keine Zuweisung an RTB1 erfolgen. Sonst macht Du Deine komplette Auswertung kaputt. Was soll großartig denn noch rausgefiltert werden, wenn aus den ursprünglichen drei Zeilen der LogFile plötzlich nur noch die eine drinsteht?

    Mehr kann ich erstmal dazu nicht sagen.

    EDIT: Oder doch. Ein anschaulicheres Beispiel:
    Du hast einen Koffer. Der Inhalt besteht aus:
    Zahnbürste
    Spiegel
    Portemonnaie
    Laptop

    Jetzt Dein Code:
    Schaue jeden Gegenstand im Koffer an
    Wenn der erste Gegenstand kein Laptop ist (1. Gegenstand ist Zahnbürste, also trifft die Bedingung zu),
    dann lege fest, dass der Kofferinhalt gleich dem ersten Gegenstand ist => alles fliegt aus dem Koffer raus, außer der Zahnbürste
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Wisiskyline schrieb:

    Weil das ganze wirft einen Fehler.
    Welchen?
    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
    Der Codeteil ist ja sowieso falsch. Ich brauche ja keine neue Textdatei sondern der überarbeitete Text soll ja
    wieder in die RTB rein. Ich könnte natürlich eine zweite machen.
    Könntest du mir evtl nochmal ein Beispielcode schicken um den Text von RTB1 zu überarbeiten und die überarbeitete version in RTB2 zu schreiben?
    Mit überarbeiten meine ich quasi alle Zeilen löschen die nicht mit "Server: Object" beginnen.

    Wisiskyline schrieb:

    sondern
    statt des Schreibens hängst Du die Liste an die betreffende RTB an:

    VB.NET-Quellcode

    1. RTB1.AppendText(DER_BETREFFENDE_TEXT & Environment.NewLine)
    Du darfst nicht stur auf die von uns geposteten Zeilen sehen und sagen:
    Bei mir heißt die Variable B und nicht A, also kann ich das ganze nicht verwenden.
    Du bekommst hier keine für Dich zugeschnittene und perfekte Lösung, sondern mehr oder weniger weitreichende Snippets, die Du verstehen sollst und dann in Deinen Code einbauen 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!
    @Popa21 Ich gehe mal davon aus, dass Du Dein Snippet nicht getestet hast. ;)
    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!
    Ja, bin am Handy
    Edit:

    VB.NET-Quellcode

    1. ​If Not line.Contains("Server: Object") Then
    2. Richtextbox1.Text = Richtextbox1.Text & line & Environment.NewLine
    3. End If
    Bei den Maßen der Einfachheit stößt man an Grenzen, aber: "Es geht immer komplizierter".

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

    @Popa21 OK. Dann probier das mal zu Hause aus und dann mein Snippet.
    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!

    Wisiskyline schrieb:

    @RodFromGermany
    Der Codeteil ist ja sowieso falsch. Ich brauche ja keine neue Textdatei sondern der überarbeitete Text soll ja
    wieder in die RTB rein.
    Ich könnte natürlich eine zweite machen.
    Könntest du mir evtl nochmal ein Beispielcode schicken um den Text von RTB1 zu überarbeiten und die überarbeitete version in RTB2 zu schreiben?
    Mit überarbeiten meine ich quasi alle Zeilen löschen die nicht mit "Server: Object" beginnen.


    Eine Datei lässt sich meines wissens nicht einfach "Bearbeiten". Sie kann nur bearbeitet und dann neu abgespeichert werden.
    Da eine Datei aus der du gerade Zeilen liest, nicht gleichzeit bearbeitet werden kann muss also eine neue Datei erstellt werden.
    Du könntest die Textdatei allerdings erst in eine List(Of String) lesen. Durch die Zeilen der List iterieren und dann die ursprungsdatei ersetzen.

    MfG Mika