headshot
Goto Top

Frage zu VBA Code zum einlesen bestimmter Werte aus einem TXT File

Hallo ich versuche schon seit 2 Tagen eine Lösung für dieses ich denke mal kleines Problem zu finden....

Also erst mal ein Kleiner Auszug aus der 18Mb großen Datei die ich Auswerten möchte die eie Auswertung einer Großrechenanlage ist :

15.03.40 JOB77211  -                                              --TIMINGS (MINS.)--            -----PAGING COUNTS----
15.03.40 JOB77211  -STEPNAME PROCSTEP    RC   EXCP   CONN    TCB    SRB  CLOCK   SERV  WORKLOAD  PAGE  SWAP   VIO SWAPS
15.03.40 JOB77211  -STIDCA        00     27     23    .00    .00    .3    496  BATCH        0     0     0     0
15.03.40 JOB77211  -RENAME        00     30     20    .00    .00     .0    607  BATCH        0     0     0     0
15.43.09 JOB77211  -LADEBBNR      00   179K  83184   3.98    .01   39.4 10816K  BATCH        0     0     0     0


Es geht um die Rot markierten werte die ich Auslesen möchte habe folgenden VBA Code schon ausprobiert jedoch ohne nennswertes Ergebnis die Einträge wiederholen sich Natürlich.

(Nur ein Auszug aus dem kompletten Code)

If InStr(1, l, "STEPNAME") <> 0 Then
textbox4 = Mid(l + 1, 22, 9) ' der Zeichenabstand
End If
Sheets("Tabelle1").Cells(j + 1, 4).Value = textbox4 'Test zu auswertun der Steps


Wäre für Hilfe dankebar

Maddin

Content-ID: 167764

Url: https://administrator.de/contentid/167764

Ausgedruckt am: 20.11.2024 um 04:11 Uhr

bastla
bastla 09.06.2011 um 14:15:12 Uhr
Goto Top
Hallo Headshot!

Wenn Du "STEPNAME" suchst, solltest Du in "InStr()" nicht "Stepname" verwenden (oder zumindest als 4. Parameter "vbTextCompare" hinzufügen) ...

Grüße
bastla
Headshot
Headshot 09.06.2011 um 14:55:38 Uhr
Goto Top
danke hab es geändert aber das Problem ist weiterhin da
Headshot
Headshot 09.06.2011 um 15:00:01 Uhr
Goto Top
Es geht um die Rot markierten Stellen, die nach Stepname Procstep, genau die Zeilen die darunter kommen STIDCA; RENAME das sind die werte dich ich aus dem gesamten Text file lesen möchte nur ich weiß nicht wie ich VBA beibringe das wenn er "STEPNAME" Gefunden hat das er genau eine Zeile weiter unten an den Stellen mit InStr() funktion die Daten ausliest. ( Da das der Einzig Feste Wert ist der immer wieder im Textfile vorkommt)

Danke Maddin
bastla
bastla 09.06.2011 um 16:46:11 Uhr
Goto Top
Hallo Headshot!

Wenn ich das richtig verstehe, gibt es mehrere Blöcke mit einer Zeile, die "STEPNAME" enthält. Aus jedem dieser Blöcke sollen aus der nächsten und übernächsten (nach der "STEPNAME" enthaltenden) Zeile Werte gelesen werden. Die Position dieser Werte ergibt sich bei einer Zerlegung anhand der Leerzeichen als 2. und 7. bzw 2. und 10. Element, wobei noch das "-" am Beginn des jeweils ersten Wertes zu eliminieren wäre. Wenn ja, würde ich das etwa so machen:
Datei = "D:\Deine große Datei.txt"  
Zeilen = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei).ReadAll, vbCrLf)  

For i = 0 To Ubound(Zeilen) - 2
    If InStr(Zeilen(i), "STEPNAME") <> 0 Then  
        Werte = Split(Zeilen(i + 1))
        Wert1 = Mid(Werte(2), 2)
        Wert2 = Werte(6)
        Werte = Split(Zeilen(i + 2))
        Wert3 = Mid(Werte(2), 2)
        Wert4 = Werte(11)
        'Verarbeitung von Wert1 - Wert4  
    End If
Next
Da das mit "Split()"erzeugte Array nullbasiert ist, müssen anstelle von 3 und 7 die Indizes 2 und 6 sowie anstelle von 3 und 12 2 und 11 verwendet werden.

Grüße
bastla

[Edit] Korrekturen vorgenommen [/Edit]
Headshot
Headshot 14.06.2011 um 08:37:26 Uhr
Goto Top
Hallo habe den Code mal ausprobiert leider bei mir nicht Funktioniert ;-(
Es kommen dabei merkwürdige Werte Raus und auch nur vereinzelt.
bastla
bastla 14.06.2011 um 09:13:55 Uhr
Goto Top
Hallo Headshot!
Es kommen dabei merkwürdige Werte Raus und auch nur vereinzelt.
Endlich einmal eine Fehlerbeschreibung, mit der sich etwas anfangen lässt ... face-wink

Grüße
bastla
Headshot
Headshot 14.06.2011 um 10:54:29 Uhr
Goto Top
Ja ich bin grade Unterwegs ich hoffe ich kann morgen mal was hochladen was das Ganze genauer beschreibt...
bastla
bastla 14.06.2011 um 11:21:04 Uhr
Goto Top
Hallo Headshot!

Inzwischen habe ich das Script getestet und erforderliche Korrekturen angebracht; soferne, wie in Deinem geposteten Beispiel (das BTW unter "<code>" bzw "</code>"-Tags gesetzt sein sollte, da die Daten damit von der Forensoftware nicht "interpretiert" und daher unverändert wiedergegeben werden) tatsächlich das Leerzeichen als Trennzeichen dient, sollte das jetzt so passen ...

Grüße
bastla
Headshot
Headshot 14.06.2011 um 14:29:03 Uhr
Goto Top
Ich habe eine Lösung gefunden Anhand eines eingefügten Schalters:
Sub Auslesen()

Dim STEPS As String
Dim JOB_ID As String
Dim JOB_NAME As String
Dim TCB As Double
Dim DATUM As Date
Dim j As Long
Dim S As Boolean
Dim ExcelSheet As Object
Dim Dateiname As String
Dim fso As Object


Dateiname = "H:\Ref_92\Kontny\G2719V00.txt"  

Set ExcelSheet = CreateObject("excel.application").Workbooks.Open(Filename:=Dateiname)  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.getFile("H:\Ref_92\Kontny\G2719V00.txt")  
Set f = f.OpenAsTextStream(1)



j = 0
Do While Not f.AtEndOfStream
l = f.ReadLine()
If InStr(1, l, "----") <> 0 Then  
textbox3 = Mid(l, 25, 22)
End If

If InStr(1, l, "STEPNAME") <> 0 Then  
S = True
End If

If InStr(1, l, "ENDED") <> 0 Then  
S = False
End If


If InStr(1, l, "-") <> 0 And S = True Then  
Textbox4 = Mid(l, 22, 9) 'Es kommt immer nur der Letzte Eintrag Raus  

Textbox5 = Mid(l, 60, 5) 'Es kommt immer nur der Letzte Eintrag Raus  

End If

If InStr(1, l, "$HASP373") <> 0 Then  
textbox1 = Mid(l, 30, 8)
textbox2 = Mid(l, 11, 8)

j = j + 1

Sheets("Tabelle1").Cells(j + 1, 2).Value = textbox1  
Sheets("Tabelle1").Cells(j + 1, 1).Value = textbox2  
Sheets("Tabelle1").Cells(j + 1, 3).Value = textbox3  
Sheets("Tabelle1").Cells(j + 1, 4).Value = Textbox4  
Sheets("Tabelle1").Cells(j + 1, 5).Value = Textbox5  

End If

Loop

End Sub

Das Problem ist das er mir von Textbox 4 und 5 immer nur die zu letzt eingelesen Werte Bringt ich möchte aber alle haben die auftauchen kann mir da jemand helfen??
im Excel sollte es dann Quasi wie folgt aussehen Bsp.:

Spalte1=Textbox4(1Eintrag)
Spalte2=Textbox5(1Eintrag)

Spalte3=Textbox4(2Eintrag)
Spalte4=Textbox5(2Eintrag)

danke noch mal auch an bastla hast mich auf die Idee mit dem Schalter gebracht^^
bastla
bastla 14.06.2011 um 22:42:25 Uhr
Goto Top
Hallo Headshot!
ich möchte aber alle haben die auftauchen kann mir da jemand helfen??
In welcher Form? Im einfachsten Fall könnte das (ungetestet) so aussehen:
'...  
Const Delim As String = "_"  

j = 1
Do While Not f.AtEndOfStream
    l = f.ReadLine
	
    If InStr(l, "----") <> 0 Then textbox3 = Mid(l, 25, 22)  

    If InStr(l, "STEPNAME") <> 0 Then  
        S = True
        Textbox4 = ""  
        Textbox5 = ""  
    End If

    If InStr(l, "ENDED") <> 0 Then S = False  

    If InStr(l, "-") <> 0 And S = True Then  
        Textbox4 = Textbox4 & Delim & Mid(l, 22, 9) 'an den bisherigen Inhalt mit "Delim" getrennt anfügen  
        Textbox5 = Textbox5 & Delim & Mid(l, 60, 5)
    End If

    If InStr(l, "$HASP373") <> 0 Then  
        textbox1 = Mid(l, 30, 8)
        textbox2 = Mid(l, 11, 8)

        j = j + 1

        With Sheets("Tabelle1")  
            .Cells(j, 2).Value = textbox1
            .Cells(j, 1).Value = textbox2
            .Cells(j, 3).Value = textbox3
            .Cells(j, 4).Value = Mid(Textbox4, Len(Delim) + 1)
            .Cells(j, 5).Value = Mid(Textbox5, Len(Delim) + 1)
        End With
    End If

Loop
End Sub
Die Textboxen 4 und 5 werden jedesmal, wenn "STEPNAME" gefunden wurde, geleert und dann darin alle entsprechenden Einträge, mit "_" als Trennzeichen (Delim), zusammengefasst. Da so als erstes Zeichen immer "_" in der Textbox steht, wird dieses beim Eintragen in die Tabelle mittels "Mid()" übersprungen.
Stilistische Anmerkungen:
  • Da die Zeilennummern in Excel mit 1 beginnen, sehe ich keinen Sinn darin, mit "j = 0" zu starten und dann bei jedem Bezug auf die Zeile "j + 1" verwenden zu müssen ...
  • "InStr" sucht defaultmäßig ab dem ersten Zeichen - eine Angabe der Anfangsposition ist nur erforderlich, wenn die Suche ohne Berücksichtigung von Groß-/Kleinschreibung (mit "vbTextCompare" als 4. Parameter) erfolgen soll.
  • Einzeilige "If" und der "With"-Block sind vermutlich Geschmackssache, Einrückungen im Code eigentlich nicht ...

Grüße
bastla
Headshot
Headshot 15.06.2011 um 02:03:18 Uhr
Goto Top
Danke danke für deine Hilfe und für die Kritik ich fang gerade erst an zu programmieren und das war ein Teil der Aufgabe die ich unter Hilfe erstellen sollte.
Nehme mir die Ratschläge zu Herzen und dann würd das schon was.

Danke