Wert einer .txt Datei zwischen 2 Wörtern auslesen.

  • Excel

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

    Wert einer .txt Datei zwischen 2 Wörtern auslesen.

    Hallo Zusammen,

    ich habe ein kleines Problem.

    Ich habe mir ein kleines Tool gebastelt das aus einer Textdatei mehrere Werte ausliest.

    Da ich den Wert kenne und er auch immer der gleiche ist (bzw. er die gleiche Bezeichnung hat)

    konnte ich den ersten teil problemlos lösen


    Visual Basic-Quellcode

    1. sub Test
    2. Open "D:\MTRNS.txt" For Input As #1
    3. Open "D:\TMP-MTRNS-From.txt" For Output As #2
    4. While Not EOF(1)
    5. Line Input #1, strZeile
    6. If strZeile Like "From*" Then
    7. Print #2, strZeile
    8. End If
    9. Wend
    10. Close #1
    11. Close #2
    12. End Sub




    Nun möchte ich einen Teil aus der Textdatei auslesen der zwischen 2 Wörtern (Bezeichnungen) steht.

    Der Text soll ausgelesen werden von (Start) "$MiniView" bis (Ende) "XXXX" <-(Wiederholt sich mehrfach in der Textdatei)

    die ausgelesenen Parts sollen dann in die entsprechende Datei: "D:\TMP-MTRNS-From.txt" gepackt werden.

    Vielen Dank im vorraus



    Grüße
    Versuch's mal damit:

    Visual Basic-Quellcode

    1. SUB Test
    2. DIM strZeile AS STRING
    3. DIM Start AS STRING
    4. DIM Ende AS STRING
    5. DIM i AS LONG
    6. DIM j AS LONG
    7. DIM x AS LONG
    8. Start = "$MiniView"
    9. Ende = "XXXX"
    10. OPEN "D:\MTRNS.txt" FOR INPUT AS #1
    11. OPEN "D:\TMP-MTRNS-From.txt" FOR Output AS #2
    12. WHILE NOT EOF( 1 )
    13. LINE INPUT #1, strZeile
    14. IF INSTR( strZeile, start ) THEN
    15. i = INSTR( strzeile, start )
    16. j = LEN( start ) + 1
    17. x = INSTR( j, strzeile, ende )
    18. strZeile = MID$( strZeile, j, x - j )
    19. PRINT #2, strZeile
    20. END IF
    21. WEND
    22. CLOSE #1
    23. CLOSE #2
    24. END SUB
    Hallo,

    erstmal danke für die Antwort.

    Leider funktioniert der Vorschlag nicht. Ich bekomme folgende Fehlermeldung:

    Laufzeitfehler '5':

    Ungültiger Prozeduraufruf oder ungültiges Argument
    bei der Zeile:

    Visual Basic-Quellcode

    1. strZeile = Mid$(strZeile, j, x - j)

    Ich habe Versucht den Code mal selber umzubauen, aber bekomme leider auch kein gescheites Ergebnis.

    Vielleicht noch eine Anmerkung: Der Start "$MiniView" und das Ende "XXXX" stehen nicht in der gleichen Zeile.



    Anbei ein Ausschnitt aus der .txt Datei:

    $MessageID:
    From: CN=C=DE
    INetFrom:
    PostedDate: 20.01.2010 11:12:29
    $Signature:
    Encrypt:
    RouteServers: CN=BLNX/O=DB AG/C=DE,CN=BLNX/O=DB AG/C=DE
    RouteTimes: 20.01.2010 11:12:29-20.01.2010 $Orig: ADE6736
    $UpdatedBy: CN=
    Categories:
    $Revisions:
    DeliveredDate: 20.01.2010 11:12:31
    $MiniView:



    mehrere Zeilen Text usw.


    XXXX



    Bekomme es leider nicht hin :(

    Grüße
    Hast Du schon mal was von Haltepunkten gehört? Diese kann man im Code setzen, damit der Programmablauf dort anhält, um zum Beispiel die Werte von Variablen zu prüfen.
    Dabei wäre Dir aufgefallen, das x-j negativ ist, wenn der Fehler auftritt.

    Was Du machen musst, ist zuerst prüfen, ob $MiniView in der Zeile vorhanden ist.
    Falls ja, den Text ab dort in eine Variable auslesen.
    Für die nächsten Zeilen prüfen, ob XXXX in der Zeile vorhanden ist.
    Falls nein, die ganze Zeile der Varibalen anfügen sonst, nur den Teil bis zum XXXX auslesen und zur Variablen hinzu.
    Jetzt kannst Du die Variable abspeichern.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Hallo,

    anhand deiner Umschreibung der Textdatei konnte keiner ahnen, das die gesuchten Worte in verschiedenen Zeilen stehen.

    Versuch's mal hiermit:

    Visual Basic-Quellcode

    1. SUB Test
    2. DIM strZeile AS STRING
    3. DIM Start AS STRING
    4. DIM Ende AS STRING
    5. DIM i AS LONG
    6. Start = "$MiniView"
    7. Ende = "XXXX"
    8. OPEN "D:\MTRNS.txt" FOR INPUT AS #1
    9. OPEN "D:\TMP-MTRNS-From.txt" FOR OUTPUT AS #2
    10. i=0
    11. WHILE NOT EOF( 1 )
    12. LINE INPUT #1, strZeile
    13. IF i THEN
    14. PRINT #2, strZeile
    15. END IF
    16. IF INSTR( strZeile, start ) THEN
    17. PRINT #2, strZeile
    18. i=1
    19. END IF
    20. IF INSTR( strZeile, ende ) THEN
    21. i=0
    22. END IF
    23. WEND
    24. CLOSE #1
    25. CLOSE #2
    26. END SUB
    Super!!! funktioniert perfekt! :)

    Vielen vielen Dank!



    Blöderweise ist im nächsten Step meines Programms ein weiteres Problem aufgetreten :wacko:

    Wenn ich den Inhalt der Textdatei anschließend nach excel importiere (via VBA) schreib er mir die Zeilen alle untereinander in die Zellen.

    Visual Basic-Quellcode

    1. Sub import
    2. Dim Zeile as String
    3. Open "D:\TMP-MTRNS-Text.txt" For Input As #1 ' Datei öffnen.
    4. i = 0
    5. Do While Not EOF(1)
    6. If i Then
    7. x1 = Zeile
    8. End If
    9. If InStr(Zeile, Start) Then
    10. x2 = Zeile
    11. i = 1
    12. End If
    13. If InStr(Zeile, Ende) Then
    14. i = 0
    15. End If
    16. Input #1, Zeile
    17. Tabelle2.Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = Zeile
    18. Loop
    19. Close #1
    20. End Sub


    Ich benötige den Text allerdings wieder von "$MiniView" - "XXXX" in einer Zelle. Hab schon ein wenig rumprobiert aber mir fehlen da wohl die Erfahrungen... bzw. das Wissen :rolleyes:
    Hallo,

    versuch's mal hiermit.

    Wenn du die temporären Dateien nicht benötigst, kannst du auch gleich die Originaldatei einlesen.
    Da ich zur Zeit nicht mit Excel testen kann (will), haben ich zum Testen die testaus.txt Datei eingefügt.

    Visual Basic-Quellcode

    1. SUB import
    2. DIM Zeile AS STRING
    3. DIM start AS STRING
    4. DIM ende AS STRING
    5. DIM ausgabe AS STRING
    6. DIM i AS LONG
    7. Start = "$MiniView"
    8. Ende = "XXXX"
    9. OPEN "D:\TMP-MTRNS-Text.txt" FOR INPUT AS #1 'Datei öffnen.
    10. OPEN "D:\testaus.txt" FOR OUTPUT AS #2
    11. i = 0
    12. WHILE NOT EOF( 1 )
    13. INPUT #1, Zeile
    14. IF INSTR( Zeile, Start ) THEN
    15. ausgabe = ""
    16. i = 1
    17. END IF
    18. IF i THEN
    19. ausgabe = ausgabe + " " + zeile
    20. END IF
    21. IF INSTR( Zeile, Ende ) THEN
    22. i = 0
    23. ausgabe = LTRIM$(ausgabe)
    24. 'Tabelle2.Cells( Rows.Count, 4 ).End( xlUp ).Offset( 1, 0 ) = AUSGABE
    25. PRINT #2, ausgabe
    26. END IF
    27. WEND
    28. CLOSE #1
    29. CLOSE #2
    30. END SUB
    Vielen Dank Eierlein funktioniert Super! :D

    Ich versuche gerade eine max. Zeichenbegrenzung pro Zeile zu definieren, da teileweise der ausgelesene Text über 1000 Zeichen lang ist und eine Textdatei nur 1000 Zeichen in eine Zeile schreiben kann (Danach Zeilenumbruch).

    Visual Basic-Quellcode

    1. Open "D:\MTRNS.txt" For Input As #1
    2. Open "D:\TMP-MTRNS-Text.txt" For Output As #2
    3. start = "$MiniView"
    4. ende = "XXXX"
    5. i = 0
    6. While Not EOF(1)
    7. Input #1, Zeile
    8. If InStr(Zeile, start) Then
    9. ausgabe = ""
    10. i = 1
    11. End If
    12. If i Then
    13. ausgabe = ausgabe + " " + Zeile
    14. End If
    15. If InStr(Zeile, ende) Then
    16. i = 0
    17. ausgabe = LTrim$(ausgabe)
    18. End If
    19. If Len(Zeile) > 1000 Then
    20. Print #2, "Text zu groß"
    21. Else
    22. Print #2, ausgabe
    23. End If
    24. Wend
    25. Close #1
    26. Close #2


    Die Anzahl der Zeichen bekomme ich doch über den "len" Befehl oder?

    Der Code Zeigt zwar keinen Fehler an macht aber nicht das was er eigentlich soll. (Wenn der eingelesene Text von "MiniView" bis "XXXX" länger bzw. > als 1000 Zeichen ist dann "Text zu groß" ausgeben)
    Hallo,

    wenn du die Ausgabe bei zu langen Zeilen in der nächsten Zeile fortsetzen willst, dann versuch's mal damit:

    Die vorhandene > IF i THEN < Abfrage erweitern!


    Visual Basic-Quellcode

    1. IF i THEN
    2. ausgabe = ausgabe + " " + Zeile
    3. IF LEN( ausgabe ) > 950 THEN 'Sollte höchstens 1000 - Länge des längsten Wortes sein
    4. PRINT #2, ausgabe
    5. ausgabe = "Fortsetzung: " 'wenn in der Folgezeile kein Hinweis stehen soll, dann ausgabe = ""
    6. END IF
    7. END IF