String nach bestimmten Muster ausgeben (Aus Datei)

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Xylon.

    String nach bestimmten Muster ausgeben (Aus Datei)

    Hallo liebes Forum,

    ich hätte da mal wieder eine Frage. Und zwar habe ich eine .txt Datei die ich erstmal schön in eine TextBox Lade. In der Datei sind die Strings allerdings gruppiert. Hier ein kleines Beispiel:


    Header
    <- Leerzeile
    Name1
    0101001010100010 <- Zahlen als String
    1000101000010100
    <- Leerzeile
    Name2
    0101001001010010 < Zahlen als String
    1000100100100100

    usw. Und ich würde jetzt gerne sämtliche Strings filtern und ausgeben. Der Header ist erstmal unwichtig. Wichtig ist z.B. der String nach jedr Leerzeile und dann der String nach dem Text bis zur nächsten Leerzeile. Und dann halt immer so weiter. Dachte erst an Regex, aber irgendwie funktioniert das nicht, vielleicht liegts auch an mir :S. Dann habe ich es noch mit Split und Mid versucht. Aber alles ging nicht...

    Regex Muster wäre dann ja "\n.$" für alle Zeichen nach dem Leerzeichen. Und dann wollte ich von da bis zum nächsten Leerzeichen machen.

    Mein Problem ist nun, dass ich nicht so recht weiß womit ich am besten vorgehen soll, da die Datei auch endlos lang weiterläuft. Was würdet ihr mir da empfehlen?
    @Xylon: Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. For i = 1 To TextBox1.Lines.Length - 1 Step 4
    3. Label1.Text = TextBox1.Lines(i)
    4. Label2.Text = TextBox1.Lines(i + 1)
    5. Label3.Text = TextBox1.Lines(i + 2)
    6. Label4.Text = TextBox1.Lines(i + 3)
    7. MessageBox.Show("Werte zur Gruppe "(i \ 4 + 1).ToString)
    8. Next
    9. End Sub
    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: Vielleicht hätte ich noch dazu sagen sollen, dass ich eine CheckedListBox habe und jede Zeile nach einer Leerzeile in dieser CLB ausgegben werden soll. Würde ich das nach deinem Vorbild machen sähe das ja in etwa so aus:

    VB.NET-Quellcode

    1. For i = 1 To TextBox1.Lines.Length - 1 Step 4
    2. CheckedListBox1.Items.Add(TextBox8.Lines(i))
    3. CheckedListBox1.Items.Add(TextBox8.Lines(i + 1))
    4. CheckedListBox1.Items.Add(TextBox8.Lines(i + 2))
    5. CheckedListBox1.Items.Add(TextBox8.Lines(i + 3))
    6. MessageBox.Show("Werte zur Gruppe "(i \ 4 + 1).ToString)
    7. Next


    Allerdings funktioniert das nicht...Außerdem ist die Datei, wie ich ja schon sagte, extrem lang, und ich denke das ist weniger Produktiv wenn ich alle Zeilen einzeln schreibe. Kann man nicht mit Regex gleich alle Zeilen nach einer Leerzeile deklarieren bzw. ausgeben? Ich blicke da noch nicht so ganz durch...

    Xylon schrieb:

    alle Zeilen nach einer Leerzeile deklarieren
    Nimm einen StreamReader und lies die Datei zeilenweise aus, überspring die, die Du nicht brauchst.
    Eine CheckedListBox in diesem Zusammenhang wäre mir zu träge. Wozu brauchst Du die Checks?
    --------------
    Ich hatte mit meinem Step 4 eine Vorsortierung gemacht, die Du wieder aufgehoben hast, Du kannst mit Step 1 durchgehen und die For-Schleife nur aus ihrer 1. Zeile bestehen lassen. :D
    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: Okay StreamReader ist gar kein Problem. Wie kann man denn dann Zeilen überspringen? Wie ich schon sagte muss ich die Datei Splitten. In meinem Beipsiel soll Name 1 z.B. in TextBox5 stehen und alles von da an bis zur nächsten Leerzeile in TextBox6. Die CheckedListBox ist nötig, weil alle Überschriften bzw. in meinem Beispiel Name1, Name2 usw. sollen angewählt werden können. Und der String unter den Überschriften soll dann in einer anderen TextBox ausgegeben werden.

    Xylon schrieb:

    Wie kann man denn dann Zeilen überspringen?
    mit ReadLine() :D
    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!
    @nafets3646: Ja wie gesagt ich blicke da noch nicht so ganz durch :/
    @RodFromGermany: ReadLine hat gar keine Argumente :O Außerdem müsste ich doch dann ständig ReadLine benutzen oder? Wäre da nicht RegEx leichter? Auch wenn ich nicht so recht weiß wie :(
    Mit ReadLine liest Du genau eine Zeile ein oder setzt, wenn Du die Variable nicht verwenden willst, den Read-Zeiger eine Zeile weiter.
    Wenn Du den Aufbau der Datei kennst, solltest Du sieses Wissen auch nutzen.
    Damit RegEx richtig funktioniert, solltest Du mehr als eine Zeile untersuchen.
    Was genau möchtest Du denn rausfiltern?
    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:

    Okay. Also ich muss immer 2 Strings rausfiltern. Beispiel:

    ÜBERSCHRIFT
    000000000000000
    111111111111111
    222222222222222

    ÜBERSCHRIFT nr.2
    000000000000000
    111111111111111
    222222222222222

    Und das geht immer so weiter. Und dabei möchte ich immer JEDE Zeile NACH einer Leerzeile als Item in der CheckedListBox sowie in der TexBox6 ausgeben. Und wenn man dann z.B. auf die erste Überschrift(in der CLB) klickt sollen die Zahlen(als String) in der TextBox5 ausgegeben werden.

    Ich hoffe das ist so verständlich. Ich dachte man könnte dann einfach mit RegEx arbeiten und z.B. "\n.$" als pattern nehmen.
    Nix RegEx, Zeilen zählen und feddich. So wie ich es Dir oben gezeigt habe.
    Das Ziel musst Du narürlich noch organisieren.
    Fang erst mal so an, dass Du die richtigen Zeilen iwo anhängst, egal ob TextBox oder Datei.
    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: Naja. Also ich habs schon geschafft jede Zeile einzeln auszugeben. Allerdings bringt mich das nicht weiter. Und mit ReadLine kann ich stundenlang warten weil die Datei wirklich meilenlang ist und zwischendurch mal übergeordnete Kategorien als String erscheinen... Am besten wäre eine Funktion mit der ich Start und Ende (also Zeilenweise) festlegen könnte. Dann könnte ich Leerzeile als Start und Ende festlegen. Und wenn ich dann mit einer For each Schleife weitermache sollte das doch gehen oder?

    Xylon schrieb:

    Dann könnte ich Leerzeile als Start und Ende festlegen.
    Dann müsstest Du Dich ja iwie durch die Datei auf der Festplatte selbst wühlen, davon würde ich dringend abraten.

    Xylon schrieb:

    und zwischendurch mal übergeordnete Kategorien als String erscheinen...
    Das ist aber neu jetzt.
    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: Ja tut mir leid, hab ich auch erst jetzt gesehen. Vielleicht hilft das aber: wie in meinem Beispiel sind die Überschriften und Kategorien immer Texte. Die Codes sind zwar auch Strings aber fangen Entweder mit 0 oder F an (Hex). Und die Kategorien stehen über den Überschriften. Die könnte man filtern indem man überprüft ob in er nächsten Zeile Zahlen stehen oder Wörter. Hab wegen ReadLine nochmal gegooglet aber ich versteh das noch nicht so recht. Könntest du mir das vielleicht netterweise kurz erklären?

    Gruß
    Bsp.:

    VB.NET-Quellcode

    1. ' Schleife zum einlesen
    2. Do
    3. sBuffer = StreamR.ReadLine
    4. If sBuffer.Length = 0 Then
    5. bCat = True ' Der nächste Durchlauf müßte eine neue Kategorie sein
    6. Else
    7. ' Handelt es sich um eine neue Kategorie?
    8. If bCat Then
    9. ' Neue Kategorie anlegen
    10. bCat = False
    11. Else
    12. ' Die nächsten Einträge der neuen Kategorie zuordnen
    13. End If
    14. End If
    15. Loop Until StreamR.EndOfStream


    bCat vor der Schleife auf True setzen damit die erste Zeile in der Datei als Kategorie erkannt wird.
    Danach müßte jede Zeile nach einer leeren Zeile als neue Kategorie erkannt werden.
    Und die nachfolgenden bis zur nächsten leeren Zeile als Childs.

    Xylon schrieb:

    kurz erklären?
    Da Du jede Zeile einzeln auslesen musst, kannst Du sie auch separat untersuchen.
    Einmal hast Du Deine Vierer-Gruppen, dann hast Du Deine Zwischenüberschriften.
    Wenn gesichert ist, dass eine Vierer-Gruppen nicht unterbrochen wird, mach Dir eine separate Routine, in der Du diese abarbeitest.
    Ansonsten musst Du nur noch Zwischenüberschrift oder neue Vierer-Gruppe unterscheiden.
    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: Achso, und da kommt dann das ReadLine ins Spiel, ich benutze das um jede Zeile auszulesen und dann zu überprüfen ob ein Code, ein Name, Leerzeile oder eine Überschrift vorhanden ist?
    @Xylon: So isses.
    Und wenn Du weißt, dass eine Vierer-Gruppe ansteht, sind in der Prozedur 4 ReadLines drin. :D
    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!