VB Textfiles nach Spalten durchsuchen

  • VB.NET

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    VB Textfiles nach Spalten durchsuchen

    Hallo gibt es eine Möglichkeit in Visual Basic Textfiles nach Spalten zu durchsuchen? (Bin leider noch ein Anfänger was Programmierung und VB angeht)

    Bsp.:

    1 2 3 4
    a b c d
    e f g h

    Die Spalten sind jeweils Tab getrennt. Optional sollte man noch andere Trennzeichen nehmen können das ist aber erstmal zweitrangig. Ich möchte jetzt zum Beispiel die Spalte 3 nach "c" durchsuchen.

    Die einzige Möglichkeit die mir einfällt wäre das Textfile Zeile für Zeile einzulesen. Die Zeile jeweils in ein String umzuwanden und die Spalten mit "split" zu trennen und nach dem Suchbegriff zu suchen.
    Gibts einen bessere Lösung, die vorallem von der Laufzeit besser ist?

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

    mhh...
    also alle textdatein in xml zu konvertieren kommt eigentlich nicht in frage, da es sich um mehrere riesige Textdatein handelt. Jeweils zirka 50MB pro Textdatei. Insgesamt sind alle Textdatein bis zu ca. 3 gb groß. Wenn dann müsste ich die Textdatein in VB in xml konvertieren wenn das irgendwie geht!? danke schonmal für die schnelle antwort
    dateiendung ist .txt

    die dateien werden so in die Textdatei geschrieben:

    1(Tab)2(Tab)3(Tab)4(Tab)5(Tab)6
    a(Tab)b(Tab)c(Tab)d(Tab)e(Tab)f
    g(Tab)h(Tab)i(Tab)j(Tab)k(Tab)l
    m(Tab)n(Tab)o(Tab)p(Tab)q(Tab)r


    Ich möchte jetzt zum Bespiel auswählen suche in Spalte 5 den Buchstaben k und gebe die komplette Zeile aus. mfg
    Also ich hab das jetzt mit dem StreamReader gelöst. Also erstmal Zeile für Zeile lesen und nach dem Suchbegriff suchen. Wenn was in der Zeile gefunden wurde splite ich das Ergebnis (In meinem Fall nach Tabs) auf. Hinausbekomme ich dann ein Array. Im Array kann ich dann in der jewilige Spalte gucken ob der Suchbegriff vorkommt. Meiner Meinung ist das die schnellste und beste Lösung. Falls jemand Interesse hat kann ich den Programmcode weiter geben. Danke für eure Mithilfe. Oder hat jemand noch eine bessere Lösung?^^
    mfg

    gitarre94 schrieb:

    StreamReader
    brauchst Du nicht, dies liest auch sequenziell:

    mox schrieb:

    VB.NET-Quellcode

    1. For Each line In File.ReadLines("deine txt")
    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!
    Wenn du die Textdateien hättest und dir daraus ein gescheites Dataset machst... hätte es den Charme, dass du das ganze dann mit nem Einzeiler als XML sicher kannst.
    Im Grunde musst du doch eh die ganze Datei durchnudeln um zu prüfen ob was vor kommt.
    Ob du erst jede Zeile durchsuchst und dann splittest oder direkt splittest... sollte sich ja nicht groß ändern... oder?
    Du kannst doch sogar so ne Textdatei übern DBProvider einlesen... und mit SQL Statements drauf arbeiten.

    Ich hab hier mal so nen Tool gebaut was auch Textdateien frisst... auch Tab-getrennte.
    Dataspy - Kleines Tool zum Öffnen aller gängigen Datenbanken

    Du kannst im Tool das "CSV-Trennzeichen" einstellen. ACHTUNG! Dafür brauchst Adminrechte auf manchen Windows-Systemen... 50MB sind nix großes!

    Mit dem Tool kannst alle CSV-Dateien in nen Ordner schmeißen und den "Ordner" öffnen. Anschließend werden alle Dateien wie Datenbanktabellen angezeigt und du kannst gemütlich mit arbeiten. Inklusive Joins usw.



    Der Quellcode für das Ganze ist... mit klein noch wohlwollend umschrieben.

    Mal getestet. Bei ner 30mb Datei dauert parsen UND anzeigen im DGV rund 2 Minuten.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    ich denke wie der TE, dass ein Einlesen der Komplett-Dateien von jeweils ca. 50MB nicht so richtig cool ist.
    Und er hat doch nu eine Lösung, die seine Anforderung befriedigt.
    Ich denke auch nicht, dass andere Ansätze schneller sein dürften, also sie bieten sicherlich mehr Möglichkeiten, aber halt um den Preis einer deutlich höheren Speicher-Belegung.

    @gitarre94: ich persönlich hab kein Interesse am Code, aber vlt. hast du ein Interesse, deinen Code hier einzustellen.
    Dann können wir darüber herfallen mit lauter Verbesserungsvorschlägen. ;)

    @MemoAnMichSelbst
    also fremdprogramm dürfen wir nicht nehmen ist dür eine Projektarbeit

    @ErfinderDesRades
    Vielleicht hast du ja noch Verbesserungsvorschläge^^

    VB.NET-Quellcode

    1. Dim suchzeile As String
    2. For Each file As String In My.Computer.FileSystem.GetFiles(FolderBrowserDialog1.SelectedPath, FileIO.SearchOption.SearchAllSubDirectories, "*txt")
    3. Dim sr1 As New System.IO.FileStream(file, IO.FileMode.Open, IO.FileAccess.Read)
    4. Dim reader1 As New System.IO.StreamReader(sr1)
    5. Do Until reader1.EndOfStream
    6. suchzeile = reader1.ReadLine
    7. If suchzeile.Contains(suchbegriffe) Then
    8. Dim spalten = Split(suchzeile, vbTab)
    9. If spalten(inhaltspalte(0)).Contains(suchbegriffe) Then
    10. suchergebnisse.Add(suchzeile)
    11. End If
    12. End If
    13. End Select
    14. Loop
    15. Next

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

    hoffe es ist so okay

    VB.NET-Quellcode

    1. Private Function Txtdurchsuchen()
    2. Dim suchzeile As String
    3. Dim suchbegriff As String
    4. Dim x As Integer 'ausgewählte Spalte
    5. Dim suchergebnisse As New ArrayList
    6. For Each file As String In My.Computer.FileSystem.GetFiles("C:\Neuer Ordner", FileIO.SearchOption.SearchAllSubDirectories, "*txt")
    7. Dim sr1 As New System.IO.FileStream(file, IO.FileMode.Open, IO.FileAccess.Read)
    8. Dim reader1 As New System.IO.StreamReader(sr1)
    9. Do Until reader1.EndOfStream
    10. suchzeile = reader1.ReadLine
    11. If suchzeile.Contains(suchbegriff) Then
    12. Dim spalten = Split(suchzeile, vbTab)
    13. If spalten(x).Contains(suchbegriff) Then
    14. suchergebnisse.Add(suchzeile)
    15. End If
    16. End If
    17. Loop
    18. Next
    19. End Function
    nicht ok, aber bringt einen gewaltig voran.
    zB sieht man so, dass du STrict Off programmierst, das wäre das nächste, was du ändern solltest.
    Besser vorher nicht an anderen Stellen weiter-coden, je länger man strict Off codet, desto mehr Mist schleicht sich ein, und schafft Probleme, ihn wieder auszumisten.

    Visual Studio - Empfohlene Einstellungen

    einfach umsetzen, was in den Videos gezeigt ist, es werden dann allerlei Code-Horrors zutage treten.

    Also einen kann ich schomal benennen: Deine Methode hier hat gar keinen Datentyp für den Rückgabewert definiert.
    Du weißt also nicht, was deine eigene Methode zurückgibt, oder?

    Strict On wird dir beibringen, das zu wissen :)

    sorry - gleich der nächste Code-Horror: Deine Function gibt ja garnix zurück 8| also was soll das eiglich?
    Mir ging es eher darum dass es über die dbprovider mit paar Zeilen Code machbar ist. Nicht dass du das Programm nutzt.
    Daten auswerten ist ja der Zweck davon.
    Und du scheinst noch den Visual Basic Import drin zu haben (Split Function ist zB nicht objektorientiert bei dir). Nicht schön.
    Nutze wirklich die vom Erfinder verlinkten Einstellung
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    lol
    35 Fehler wenn ich auf Strict On stelle

    Eigentlich hatte ich das in einem Sub stehen gehabt. Mein Rückgabewert ist die ArrayList suchergebnisse
    Diese ArrayList kann ich mit einer For each Schleife dann in eine Listbox übertragen.
    Wäre noch was am Suchalgorithmus zu verbessern?