String suchen und die nächsten 2 zeilen DANACH kopieren

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    String suchen und die nächsten 2 zeilen DANACH kopieren

    Moin,

    ich stehe gerade vor dem Problem in einem Text nach einem String ("Befund:") zu suchen, und alles was in den darauffolgenden Zeilen kommt in einem neuen String zu Kopieren und auszugeben.
    Wahrscheinlich voll einfach, aber ich stehe total auf dem Schlauch.
    Code bisher:

    Quellcode

    1. Dim pfad As String = My.Settings.Dir_Austausch 'global gesetzter Pfad
    2. Dim file As String
    3. Dim befund As String
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim rtb As New RichTextBox
    6. OpenFileDialog1.ShowDialog()
    7. file = OpenFileDialog1.FileName
    8. rtb.LoadFile(file)
    9. befund = RichTextBox1.Text
    10. My.Computer.FileSystem.WriteAllText(pfad & "\out.txt",
    11. befund, True)
    12. End Sub


    in der out.txt sollen dann nachher die Gefundenen Strings sein.
    Der Suchbegriff "Befund:" kann auch mehrfach in einem Dokument vorkommen, es sollen dann auch alle ausgegeben werden.

    VB.NET-Quellcode

    1. Dim pfad As String = My.Settings.Dir_Austausch 'global gesetzter Pfad
    2. Dim file As String
    3. Dim befund As String
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim rtb As New RichTextBox
    6. OpenFileDialog1.ShowDialog()
    7. file = OpenFileDialog1.FileName
    8. rtb.LoadFile(file)
    9. Dim splts = "RichTextBox1.Text".Split({"befund"}, 2, StringSplitOptions.None)
    10. befund = If(splts.Length > 1, splts(1), "nix gefunden")
    11. My.Computer.FileSystem.WriteAllText(pfad & "\out.txt", befund, True)
    12. End Sub
    Bitte <vb.net>-Tag verwenden - nicht <Code>
    @ErfinderDesRades wäre da ein RichTextBox.Find mit RichTextBoxFinds.Reverse nicht besser? Er sagte ja, dass es vielleicht auch mehrmals den String Befund: geben könnte. Oder ist geht das bei deinem Code auch? Wenn ja wäre es cool und kürzer als ich vermutet hätte, bei mir hätte halt mehrfach eine Prüfung durchgeführt werden müssen und es wäre über die Zeilennummer (Index) gegangen.
    @PapaBeer92 Ohne temporäre RichTextBox:

    VB.NET-Quellcode

    1. Dim lines = IO.File.ReadAllLines(DEIN_PFAD)
    2. For i = 0 to lines.Length - 3 ' so ist gesichert, dass es nicht knallt
    3. If lines(i).Contains(DEIN_WORT) Then
    4. DoAny(lines(i + 1), lines(i + 2)
    5. End If
    6. 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!

    ThomasG82 schrieb:

    wäre da ein RichTextBox.Find mit RichTextBoxFinds.Reverse nicht besser?
    nein.
    zumindest meine Meinung.
    Richtextbox.Find ist eine eigenartige Frickel-Lösung, nur für rtb verwendbar.
    Lieber die sehr leistungsfähigen Standards des Frameworks verwenden - wenn man da dazulernt, kommt das vielen weiteren Anwendungsfällen ebenfalls zugute.

    Er sagte ja, dass es vielleicht auch mehrmals den String Befund: geben könnte.
    Jaja - eine "belastbare Anforderungsbeschreibung" im RodFromGermany'sschen Sinne ist imo noch nicht gegeben.
    Aber damit wird er dann schon noch rüberkommen, so peu a peu :P
    Wenn nicht - hab ich hier nicht allzuviel Zeit verschwendet.
    Er sagte ja, dass es vielleicht auch mehrmals den String Befund: geben könnte.


    Jaja - eine "belastbare Anforderungsbeschreibung" im RodFromGermany'sschen Sinne ist imo noch nicht gegeben.
    Aber damit wird er dann schon noch rüberkommen, so peu a peu :P
    Wenn nicht - hab ich hier nicht allzuviel Zeit verschwendet.


    Der begriff kann mehrfach vorkommen, je nachdem wie viele dinge der Anwender Befundet. Somitmuss in das Programm definitiv die Möglichkeit haben alle Befunde zu finden und auszugeben.

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

    Ja, ich habe es getestet, funktioniert nicht. Er findet keinen Text und gibt nur nicht gefunden aus.

    Textbeispiel:


    MESSWERTE, MESSWERTE, MESSWERTE
    NOCH MEHR MESSWERTEN
    OCH VIEL MEHR WERTE

    Befund:
    Linksseitig unauffällig, Rechts multiple Dissfunktion.
    Pat. Muskelspastik abd. poli. max.

    MESSWERTE, MESSWERTE, MESSWERTE
    NOCH MEHR MESSWERTE
    NOCH VIEL MEHR WERTE

    Befund:
    Pat. unauffällig, keine Behandlung notwendig


    jetzt soll eben dass, was hinter Befund: kommt rausgefiltert und ausgegeben werden. Aktuell lief das über ein Makro, die Befunde waren strikt in Arial, 11, Kursiv formatiert und nur was eben mit dieser Formatierung gesetzt war wurde Zeichen für Zeichen ausgegeben. Unpraktisch, insbesondere da Makros ungern gesehen sind. Deswegen jetzt dieses herangehen.

    Dim lines = IO.File.ReadAllLines(DEIN_PFAD)
    For i = 0 to lines.Length - 3 ' so ist gesichert, dass es nicht knallt
    If lines(i).Contains(DEIN_WORT) Then
    DoAny(lines(i + 1), lines(i + 2)
    End If
    Next

    Übersehen! Ich teste das gleich, moment!
    Getestet, er kann mit DoAny nichts anfangen. Was genau sollte das bezwecken?

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

    mit Regex probiert?
    habe dein Bsp. Text in eine Textdatei kopiert.
    zur Ansicht in eine RTB



    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Imports System.IO
    3. Public Class Form1
    4. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    5. RichTextBox1.Text = File.ReadAllText("E:\PapaBeer92.txt")
    6. End Sub
    7. Private Sub Mark(ByVal rtb As RichTextBox, ByVal word As String, ByVal color As Color)
    8. Dim matchc As MatchCollection = Regex.Matches(rtb.Text.ToLower(), word.ToLower())
    9. For Each m As Match In matchc
    10. rtb.Select(m.Index, m.Length)
    11. rtb.SelectionColor = color
    12. rtb.Select(rtb.Text.Length, 0)
    13. rtb.SelectionColor = Drawing.Color.Black
    14. Next
    15. End Sub
    16. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    17. 'nächste Zeile markieren
    18. Mark(RichTextBox1, ".*(Befund).*\n.*", Color.Blue)
    19. 'nächste 2 zeilen markieren
    20. Mark(RichTextBox1, ".*(Befund).*\n.*\n.*", Color.Blue)
    21. End Sub
    22. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    23. Using Writer As New System.IO.StreamWriter("E:\BefundExtractData.txt") '<-- schreibe in datei
    24. For Each Match As System.Text.RegularExpressions.Match In _
    25. System.Text.RegularExpressions.Regex.Matches _
    26. (My.Computer.FileSystem.ReadAllText("E:\PapaBeer92.txt"), "(.*(Befund).*\n.*\n.*)|(.*(Befund).*\n.*)", RegexOptions.IgnoreCase)
    27. Writer.WriteLine(Match.Value)
    28. Next
    29. End Using
    30. End Sub
    31. End Class

    PapaBeer92 schrieb:

    Getestet, er kann mit DoAny nichts anfangen.

    Das musst Du nach Deinen Bedürfnissen implementieren.
    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!

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