RTF Datei auslesen

  • VB.NET

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

    RTF Datei auslesen

    Hi zusammen,


    ich habe beruflich immer damit zu kämpfen aus Log Files in Form von RTF Dateien gezielt Inhalte zu suchen (Strg + F im Word) und dann die Geschehnisse zu bewerten.

    Für eine bessere Übersicht möchte ich nu gerne folgendes realisieren:

    Die DAtei einlesen (.rtf) und nur die Zeilen in der RTF anzeigen die in einer vom User eingegebenen Textbox.text vorgegeben wurden.

    Das soll dann eine schnelle Übersicht liefern.
    Die RTF Größe liegt im Schnitt bei rund 42 MB, ca. 35 000 000 Zeichen, ca. 7 500 000 Wörter.

    Spielt die Dateigröße eine Rolle? Kann mir jmd. im groben sagen wie ich hier vorgehen kann?
    Gruß Hannes

    hans im glück schrieb:

    Die DAtei einlesen (.rtf)
    geht mit einer RichTextBox so:

    VB.NET-Quellcode

    1. RichTextBox1.LoadFile("c:\temp\test.rtf", RichTextBoxStreamType.RichText)
    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 das gesuchte immer in der selben zeile steht, könntest du diese zeile auslesen...

    C#-Quellcode

    1. ​portnummer = File.ReadAllLines("D:\\Portnummer.txt")[0];
    das in der [] klammer ist die Zeilennummer...ist ein stück code aus meinem aktuellen Projekt
    danke für die hilfe!
    äuft, wenn auch manche zeichen nicht korrekt dargestellt werden


    bei .richtext bringt er falsches DAteiformat, es funktioniert nur .plaintext fehlerfrei.jedoch fehlt mir nun der Ansatz wie ich die Daten filtern kann, also nicht alles anzeigen sondern nur die Zeile die gewisse Strings enthält.

    Außerdem wäre es interessant dem Anwender zu signalisieren dass derzeit der ladevorgang läuft.... der braucht nämlich gewisse Zeit.Kann mir jmd. helfen?


    Edit: Die File die ich einlese wird wohl in Unicode UTF 8 abgelegt, habe daher auf

    VB.NET-Quellcode

    1. ​.unicodeplaintext

    geändert. Nun rödelt das Programm jedoch ohne FEhlermeldung bis zum unkommentierten Crash... auch komisch.

    Habe folgendes beisammen und bekomme weder Fehler noch Ergebnis:

    Quellcode

    1. ​ Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Try
    3. RichTextBox1.LoadFile("C:Test.rtf", RichTextBoxStreamType.UnicodePlainText)
    4. Catch ex As Exception
    5. MessageBox.Show(ex.Message)
    6. End Try
    7. End Sub
    Gruß Hannes

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hans im glück“ ()

    hans im glück schrieb:

    weder Fehler noch Ergebnis:
    Kannst Du mal ein (in sich komplettes) Stück der RTF-Datei posten?
    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!
    was ich sage: Plaintext:
    Spoiler anzeigen
    LCN-PRO Busmonitor Aufzeichnung (Version=5.11 Release=Sep 23 2014)
    Projektname: C:\Users\LCN\Desktop\stand 110814.lp3
    Beginn der Aufzeichnung: 2015/01/07 00:00
    ------------------------------------------------------------------
    00:00:00:012 - M040 BinSensor 0 1 1 0 0 0 0 0
    00:00:00:044 - M042 Ausg.2: 0.0%
    00:00:00:387 - M042 BinSensor 0 0 0 0 0 1 0 0
    00:00:00:574 - M044 → M044 Wiederhole Binärsensor: - - - - - 6 - 8
    00:00:00:605 - M044 → M045 LED 4: AUS
    00:00:00:668 - M044 → M045 Entsperre Regler 1
    00:00:00:668 - M045 Regler 1 Sollwert: 1220
    00:00:00:683 - M044 → M044 Sperre Ausg. teilweise: (0%) 1 2 - für 14d
    00:00:00:824 - M044 Ausg.2: 0.0%
    00:00:00:902 - M044 BinSensor 0 0 0 0 0 1 0 0
    00:00:01:026 - M050 Ausg.2: 0.0%
    00:00:01:042 - M057 Ausg.1: 0.0%
    00:00:01:120 - M057 Ausg.2: 0.0%
    00:00:01:494 - M023 → M023 Wiederhole Binärsensor: 1 2 - - - - - -
    00:00:01:510 - M023 → M022 LED 2: AUS
    00:00:01:510 - M046 Ausg.1: 0.0%
    00:00:01:588 - M023 → M022 LED 3: AUS
    00:00:01:588 - M023 BinSensor 0 0 0 0 1 1 0 0
    00:00:01:682 - M008 → M008 Nullstellen
    00:00:02:025 - M040 Ausg.1: 0.0%
    00:00:02:087 - M042 Ausg.1: 0.0%
    00:00:02:462 - M020 → M020 Wiederhole Binärsensor: 1 - 3 - - - - -
    00:00:02:477 - M020 → M021 LED 2: AUS
    00:00:02:524 - M020 → M021 LED 3: AUS
    00:00:02:586 - M045 → M104 Relais: - - - 1 - - - -
    00:00:02:680 - M104 Relais: 1 1 0 1 0 0 0 0
    Und es sind Datensätze mit mindestens 3 Spalten, wobei die letzte Spalte sehr variantenreich ist, das wird ziemlich unangenehm zu parsen.

    Auf jeden Fall überleg dir ein Datenmodell.
    Denn viele Leute meinen, sie könnten immer was einlesen, wenn sie StreamReader.ReadLines() können, haben aber gar nichts, wo sie es hinein-einlesen können.

    Nimm als Datenmodell ein typisiertes Dataset. Damit kannst du differenziert sortieren, und auch komplexe Filter setzen, für jede Property udn auch für Property-Kombinationen etc.
    DataExpressions: Filter und berechnete Spalten im Dataset

    Später kannste den Kram auch in eine Datenbank schubsen, und wärst mit deinen Analysen nicht mehr an die einzelnen LogDateien gebunden.

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

    wieso mit einer Dataview?
    Ist BindingSource.Filter nicht gut?

    Und bist du dir sicher, dass das alles ist?
    Weil die erste Spalte sind offensichtlich Zeitwerte, die 2. Spalte sind iwelche Objekte, und inne 3. Spalte steht was komisches, was damit gemacht wurde.
    Da wäre es u.U. auch mal sinnvoll, nach M040 ausdrücklich nur in Spalte2 zu filtern.

    Und natürlich wird jede Zeile in eine DataTable eingelesen, nur nicht mittm add newrow - Befehl, weil den gibt es nicht.

    hans im glück schrieb:

    könnte ich nicht jede zeile in eine datatable
    Zumindest kannst Du diese Datei zeilenweise lesen und auswerten:

    VB.NET-Quellcode

    1. For Each line In IO.File.ReadLines("DEINE_DATEI")
    2. ' halt was mit line machen, z.B.
    3. MessageBox.Show(line)
    4. 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!
    ich bin glücklich :) vielen dank an alle !
    kritik erwünscht, funktioniert aber schonmal und hilft mir sehr weiter...

    Quellcode

    1. ​ Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Try
    3. RichTextBox1.LoadFile("C:\Test.rtf", RichTextBoxStreamType.PlainText)
    4. Catch ex As Exception
    5. MessageBox.Show(ex.Message)
    6. End Try
    7. End Sub
    8. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    9. Dim row As DataRow
    10. For Each line In IO.File.ReadLines("C:\test.rtf")
    11. Try
    12. row = DataSet1.tblLcn.NewRow()
    13. row("l") = line
    14. DataSet1.tblLcn.Rows.Add(row)
    15. TblLcnDataGridView.DataSource = DataSet1.tblLcn
    16. Catch ex As Exception
    17. MessageBox.Show(ex.Message)
    18. End Try
    19. Next
    20. End Sub
    21. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    22. Dim dv As New DataView(DataSet1.tblLcn)
    23. Try
    24. dv.RowFilter = "l like '%" + TextBox1.Text + "%'"
    25. TblLcnDataGridView.DataSource = dv.ToTable
    26. Catch ex As Exception
    27. MessageBox.Show(ex.Message)
    28. End Try
    29. End Sub
    Bilder
    • img vb 1.JPG

      77,98 kB, 996×624, 238 mal angesehen
    Gruß Hannes

    hans im glück schrieb:

    kritik erwünscht
    Warum liest Du die Datei zwei Mal ein?
    Organisier die richtige Reihenfolge und mach bei Button2_Click aus

    VB.NET-Quellcode

    1. For Each line In IO.File.ReadLines("C:\test.rtf")
    dies:

    VB.NET-Quellcode

    1. For Each line In RichTextBox1.Lines
    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!
    danke an alle, alle hinweise sind wichtig. ich habe zwar nicht vor profi zu werden (meine definition von profi ist, dass ein profi damit sein geld verdient) aber natürlich will ich nicht komplett daneben liegen.
    das layout ist natürlich scheisse, mir war es wichtig erst einmal die funktion zu erlangen.

    alle hinweise werde ich jedoch zum anlass nehmen eine bessere version aus zu arbeiten, quasi als kleine lern hausaufgabe ;)
    von daher an edr danke für die vorschlag, aber ich werde eine neue version erstellen und dann hier zur begutachtung abliefern.
    Gruß Hannes
    na schön - wenn du selber machen willst - den Punkt Benamung kannst du sicherlich selbst bewältigen. Aber meine anderen 3 Lernfelder halte ich ohne Anleitung für ausgeschlossen.
    Hier also die Anleitungen:
    TryCatch: TryCatch ist ein heißes Eisen
    typisierte Programmiereung: vier Views-Videos - Film8
    Layout: Layout in Windows.Forms