Mehrere Textdateien auslesen und bestimmte Zeilen raus "fischen"

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von EDR-Temporär.

    Mehrere Textdateien auslesen und bestimmte Zeilen raus "fischen"

    Hallo Community,
    Ich möchte gerne ca. 10 .txt Dateien auslesen und möchte alle Zeilen die mit dem Wort Native beginnen, auslesen.
    Ich hab nichts gefunden also frag ich euch.

    Wie geht das?

    MfG
    Conway's Game Of Life Monogame Sample: 80%

    Conway's Game Of Life Monogame Sample
    schreib dir eine Function, der du die Dateinamen übergibst, und die die gefundenen Zeilen returnt.

    Die Klasse List(Of T) ist dir bekannt?

    List(Of String) nämlich ist der Datentyp, mit dem du sowohl viele Dateinamen transportieren kannst als auch viele gefundene Zeilen zurückgeben kannst.

    Schreib einfach die leere Function hin, den Inhalt schreib ich dir dann.

    VB.NET-Quellcode

    1. Public Function Foo(ByVal Fille1 as string, ByVal Fille2 as string) as string
    2. 'do sompfing
    3. end Function

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. For Each Datei In New System.IO.DirectoryInfo("C:\Users\zeus\Desktop\0").GetFiles("*.txt")
    5. ListBox1.Items.Add(Datei.Name & ":")
    6. ListBox1.Items.Add("-------------------------------------------------")
    7. For Each Zeile As String In System.IO.File.ReadAllLines(Datei.FullName)
    8. If Zeile.Trim.StartsWith("Native") Then
    9. ListBox1.Items.Add(Zeile)
    10. End If
    11. Next
    12. Next
    13. End Sub
    14. End Class


    Und ja ich kenne Substring

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

    TVX schrieb:

    Das kannte ich noch nicht !
    naja - habich extra nix zu gesagt.
    Weil böse Funktionen vermeiden wurde dir sicher schon öfters vorgelegt, Visual-Studio richtig nutzen sicher auch, aber du legst da eine gewisse Beratungsresistenz an den Tag.

    Aber vlt. riskierst du ja jetzt mal einen Blick in den ObjectBrowser, und guckst nach, was die String-Klasse sonst noch alles zu bieten hat, was du nicht kennst.
    Vlt. überzeugt es dich ja gar, den VisualBasic-GeneralImport doch noch rauszuwerfen, dass du dich besser auf die Funktionen des Frameworks konzentrieren kannst, ohne ständig die ollen Vb6-Krücken zu bemühen.

    Nun leider ganz untergegangen ist meine Herausforderung an den TE: nämlich zumindest den leeren Body einer Function hinzuschreiben, die eine Liste von Files entgegennimmt, und eine Liste von Trefferzeilen zurückgibt.
    Sowas nennt man dann Code-Design, Trennung von Daten und Oberfläche, das wäre typsicherer und klarer strukturiert, als wenn der Krempel in eine Listbox abgefüllt wird.

    TVX schrieb:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. For Each Datei In New System.IO.DirectoryInfo("C:\Users\zeus\Desktop\0").GetFiles("*.txt")
    5. ListBox1.Items.Add(Datei.Name & ":")
    6. ListBox1.Items.Add("-------------------------------------------------")
    7. For Each Zeile As String In System.IO.File.ReadAllLines(Datei.FullName)
    8. If Zeile.Trim.StartsWith("Native") Then
    9. ListBox1.Items.Add(Zeile)
    10. End If
    11. Next
    12. Next
    13. End Sub
    14. End Class


    Und ja ich kenne Substring


    Das funktioniert nicht. Das einziege was er macht ist er schreibt immer die erste Zeile aus jeder Datei da rein. Egal ob da native steht oder nicht.
    Conway's Game Of Life Monogame Sample: 80%

    Conway's Game Of Life Monogame Sample

    TheTrust3343 schrieb:

    er schreibt immer die erste Zeile aus jeder Datei da rein.
    Mach eine Testausgabe in eine separate (Rich)TextBox, setzu einen Haltepunkt rein, sieh Dir den Inhalt jeder Zeile an.
    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!
    ToLower.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. For Each Datei In New System.IO.DirectoryInfo("C:\Users\zeus\Desktop\0").GetFiles("*.txt")
    3. ListBox1.Items.Add(Datei.Name & ":")'Name der Datei
    4. ListBox1.Items.Add("-------------------------------------------------")'Trennstrich
    5. For Each Zeile As String In System.IO.File.ReadAllLines(Datei.FullName)
    6. If Zeile.ToLower.Trim.StartsWith("native") Then 'gross und kleinschreibung jetz egal
    7. ListBox1.Items.Add(Zeile)
    8. End If
    9. Next
    10. Next
    11. End Sub​
    Ist nicht so kompakt wie der von @TVX aber meiner Meinung nach übersichtlicher:

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports Microsoft.VisualBasic
    4. Imports System.IO
    5. Public Class Class1
    6. Dim filePath As String = ""
    7. Public Sub New(path As String)
    8. filePath = path
    9. End Sub
    10. Public Function getLinesWithNative() As List(Of String)
    11. Dim _list As New List(Of String)
    12. Dim fileList As New List(Of String)
    13. For Each file As String In Directory.EnumerateFiles(filePath, ".txt")
    14. fileList.Add(file)
    15. Next
    16. For Each file As String In fileList
    17. Dim contents As String = File.ReadAllText(file)
    18. Using reader As New StringReader(contents)
    19. Dim line As String = Nothing
    20. While Not reader.Peek() = -1
    21. line = reader.ReadLine()
    22. If line.ToLower().StartsWith("native") Then
    23. _list.Add(line)
    24. End If
    25. End While
    26. End Using
    27. Next
    28. Return _list
    29. End Function
    30. End Class
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln

    BeatsleigherXDA schrieb:

    übersichtlicher
    wohl eher nicht, da Du mit der Kirche um das Dorf rennst.
    Das Einzige, was ich gegenüber dem Code von TVX noch verändern würde ist das zeilenweise Auslesen der Datei, so können beliebig große Dateien verarbeitet werden, ohne den RAM zu belasten:

    TVX schrieb:

    VB.NET-Quellcode

    1. For Each Zeile As String In System.IO.File.ReadAllLines(Datei.FullName)
    ==>

    VB.NET-Quellcode

    1. For Each Zeile As String In System.IO.File.ReadLines(Datei.FullName)
    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!
    Das Einzige, was ich gegenüber dem Code von TVX noch verändern würde...
    Hmm, hmm.
    Immerhin hat BeatsleigherXDA es geschafft, meine "Herausforderung" zumindest teilweise anzunehmen, und schreibt für den Vorgang eine eigene Methode, die das Ergebnis zurückgibt.
    Aber nicht ganz geschafft, denn die Methode nimmt ihren Input nicht als MethodenArgument entgegen, sondern grabscht ihn sich von irgendwoher aussm Form, und das macht sein Code unübersichtlich.
    Und er programmiert typisiert, während TVX mal wieder eine dumme Listbox abfüllt (Keine Strings in die File-Listbox!)
    Und er codet nur im ButtonClick, also von wegen Trennung Gui-Daten echt der Anti-Pattern, auch wenn der eigliche Algo gut gelungen ist.