Zeilen zwischen vorgegebenen Start und Ende Text auslesen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Skino.

    Zeilen zwischen vorgegebenen Start und Ende Text auslesen

    Ich habe eine Textdatei, die aus vielen Blöcken besteht die nicht immer gleich lang sind. So wie in diesem Beispiel nur deutlich länger.
    Ich möchte jetzt den Text zwischen zwei 2 herausfiltern. Z.B alles was zwischen "*Taxi" und "ATS" steht.

    Ansätze: 1. RegexMatch, habe ich nichts zustande bekommen.
    2. zeilenweise einlesen und mit "if Zeile contains" Start und Endmarke setzen. Erscheint mit vielversprechend.

    EIN249 170122 OFP 1
    EBBR-EDDK VIA EBBREDDK
    A320 N320SB CRZ AT CI 6
    TOW 49.3 CRZ ALT FL170
    BLK 4.6 WIND 013/046
    ZFW 44.9 T/C OAT -17
    RES 2.3 LDW 47.8
    ------------------------
    TRIP 1.5 ALTN 1.4 EDDF
    TAXI 0.2 FINR 0.9
    ------------------------
    TRIP DIST 188 W/C -10
    WPT FREQ ALT EET REFU
    EBBR 002 4.6
    LNO 112.80 170 0012 3.6
    PODAT 170 0015 3.5
    KENUM 170 0016 3.5
    DEPOK 130 0021 3.4
    EDDK 003 0040 2.9
    ------------------------
    ATS ROUTE:
    LNO2K LNO M170 KENUM
    T862 DEPOK DEPO1N

    **** DO NOT EDIT ****
    SUMMARY:
    PAX=10
    CARGO=353KG
    FUEL=4634KG
    TAXI=230KG
    TRIP=1525KG
    ATCCS=EIN249
    FLN=EI249
    ETD=171855
    ETE=0040
    **** DO NOT EDIT ****

    [OFP]

    Was ich versucht habe aber keine Anzeige ergibt:

    Quellcode

    1. ​ For Each line In IO.File.ReadLines(CStr(ListBox1.SelectedItem)) ' Auslesen der Datei die über Listbox1 ausgewählt wurde
    2. If line.Contains("TAXI") = True Then ' Start Text
    3. Do Until line.Contains("ATS") = True ' End Text
    4. MsgBox(line) 'Die Zeilen zwischen Start und Ende
    5. Loop
    6. End If
    7. Next


    Meine Hoffnung war das ich jede Zeile zwischen den beiden Marken als MSGBox angezeigt bekomme aber das klappt nicht. Es wird immer nur die Zeile mit dem Start Text angezeigt.
    Ich muss also in der Do Until Schleife die nächste Zeile einlesen bis eine Zeile den End-Text enthält und das bekomme ich nicht hin.
    Kann bitte jemand einem alten Mann aufs Pferd helfen?
    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)
    Ich habe mir dafür mal eine Extension geschrieben:

    VB.NET-Quellcode

    1. <Extension()> Public Function Between(s As String, StartString As String, EndString As String, Optional IncludeStart As Boolean = False, Optional IncludeEnd As Boolean = False, Optional ByRef Pos As Integer = 0) As String
    2. Dim Pos2 As Integer
    3. If StartString <> "" Then
    4. Pos = s.IndexOf(StartString, Pos)
    5. If Pos < 0 Then Pos = s.Length : Return ""
    6. If Not IncludeStart Then Pos += StartString.Length
    7. End If
    8. If EndString = "" Then
    9. Pos2 = s.Length
    10. Else
    11. Pos2 = s.IndexOf(EndString, Pos)
    12. If Pos2 < 0 Then Pos2 = Pos Else If IncludeEnd Then Pos2 += EndString.Length
    13. End If
    14. Between = s.Substring(Pos, Pos2 - Pos)
    15. Pos = Pos2
    16. End Function

    Aufruf:

    VB.NET-Quellcode

    1. Dim MyString = line.Between("ATS", "TAXI")

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Vielen Dank für deine Mühe.
    Ich bekomme beim Aufruf eine Fehlermeldung:

    Quellcode

    1. For Each line In IO.File.ReadLines(CStr(ListBox1.SelectedItem)) ' Auslesen
    2. Dim MyString = line.Between("ATS", "TAXI")
    3. Next


    Fehler BC30456 "Between" ist kein Member von "String".

    Die Between-Funktion habe ich übernommen und sie zeigt keine Fehler. Ich habe vermutlich den Aufruf der Funktion nicht richtig gemacht, oder?
    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)

    Skino schrieb:

    VB.NET-Quellcode

    1. Do Until line.Contains("ATS") = True ' End Text
    Du musst natürlich davor die nächste Zeile einlesen.
    Besser ist es, mit Dim lines() = File.ReadAllLines(PFAD) zu arbeiten, da musst Du nur den Index hochzählen.
    Ansonsten Dein Code.
    ====
    Between ist eine Extension, die musst Du in ein Modul packen.
    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!
    Ein Consolen-Testcode:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim tmp As String = ""
    4. Dim start As Boolean = False
    5. For Each line In IO.File.ReadLines("d:\#1\hirni.txt") ' Auslesen der Datei die über Listbox1 ausgewählt wurde
    6. If line.Contains("TAXI") Then start = True
    7. If start Then tmp &= line & Environment.NewLine
    8. If line.Contains("ETE") Then start = False
    9. Next
    10. MsgBox(tmp) 'Die Zeilen zwischen Start und Ende
    11. End Sub
    12. End Module
    Dateien
    • hirni.txt

      (658 Byte, 38 mal heruntergeladen, zuletzt: )
    Da gleiche wie @Eierlein einfach ohne die Zeile Taxi und mit sofortigem beenden der Suche

    Freundliche Grüsse

    exc-jdbi

    EDIT: Stringbuilder ist besser

    VB.NET-Quellcode

    1. Public Sub Main()
    2. MsgBox(ToText("data.txt", "ATS", "Taxi"))
    3. End Sub
    4. Function ToText(filename As String, startstr As String, endstr As String) As String
    5. Dim start = False
    6. Dim searchstr = startstr.ToLower
    7. Dim result = New StringBuilder
    8. For Each line In IO.File.ReadLines(filename)
    9. If line.ToLower.Contains(searchstr) AndAlso Not start Then
    10. start = True
    11. searchstr = endstr.ToLower
    12. Continue For
    13. End If
    14. If line.ToLower.Contains(searchstr) AndAlso start Then
    15. Exit For
    16. End If
    17. If start Then result.Appendline(line)
    18. Next
    19. Return result.ToString
    20. End Function

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Vielen Dank an alle für die wie immer schnelle und kompetente Hilfe.
    Die Methode von @exc-jdbi nutze ich, auch weil sie verstehe.
    Die anderen werde ich definitiv auch ausprobieren, weil ich auch das gern verstehen möchte.
    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)

    Skino schrieb:

    Fehler BC30456 "Between" ist kein Member von "String".
    Das ist eine Extension.
    Die musst du in ein Modul packen.
    Wenn du sie als Funktion verwenden willst, geht das auch, aber dann musst du sie anders aufrufen:

    VB.NET-Quellcode

    1. ​Dim MyString = Between(line, "ATS", "TAXI")

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --