Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung VB for Applications

Mitglied: Headshot

Headshot (Level 1) - Jetzt verbinden

09.06.2011, aktualisiert 14.06.2011, 2646 Aufrufe, 11 Kommentare

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 :

01.
15.03.40 JOB77211  -                                              --TIMINGS (MINS.)--            -----PAGING COUNTS---- 
02.
15.03.40 JOB77211  -STEPNAME PROCSTEP    RC   EXCP   CONN    TCB    SRB  CLOCK   SERV  WORKLOAD  PAGE  SWAP   VIO SWAPS 
03.
15.03.40 JOB77211  -STIDCA        00     27     23    .00    .00    .3    496  BATCH        0     0     0     0 
04.
15.03.40 JOB77211  -RENAME        00     30     20    .00    .00     .0    607  BATCH        0     0     0     0 
05.
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
Mitglied: bastla
09.06.2011 um 14:15 Uhr
Hallo Headshot!

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

Grüße
bastla
Bitte warten ..
Mitglied: Headshot
09.06.2011 um 14:55 Uhr
danke hab es geändert aber das Problem ist weiterhin da
Bitte warten ..
Mitglied: Headshot
09.06.2011 um 15:00 Uhr
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
Bitte warten ..
Mitglied: bastla
09.06.2011 um 16:46 Uhr
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:
01.
Datei = "D:\Deine große Datei.txt" 
02.
Zeilen = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei).ReadAll, vbCrLf) 
03.
 
04.
For i = 0 To Ubound(Zeilen) - 2 
05.
    If InStr(Zeilen(i), "STEPNAME") <> 0 Then 
06.
        Werte = Split(Zeilen(i + 1)) 
07.
        Wert1 = Mid(Werte(2), 2) 
08.
        Wert2 = Werte(6) 
09.
        Werte = Split(Zeilen(i + 2)) 
10.
        Wert3 = Mid(Werte(2), 2) 
11.
        Wert4 = Werte(11) 
12.
        'Verarbeitung von Wert1 - Wert4 
13.
    End If 
14.
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]
Bitte warten ..
Mitglied: Headshot
14.06.2011 um 08:37 Uhr
Hallo habe den Code mal ausprobiert leider bei mir nicht Funktioniert ;-(
Es kommen dabei merkwürdige Werte Raus und auch nur vereinzelt.
Bitte warten ..
Mitglied: bastla
14.06.2011 um 09:13 Uhr
Hallo Headshot!
Es kommen dabei merkwürdige Werte Raus und auch nur vereinzelt.
Endlich einmal eine Fehlerbeschreibung, mit der sich etwas anfangen lässt ...

Grüße
bastla
Bitte warten ..
Mitglied: Headshot
14.06.2011 um 10:54 Uhr
Ja ich bin grade Unterwegs ich hoffe ich kann morgen mal was hochladen was das Ganze genauer beschreibt...
Bitte warten ..
Mitglied: bastla
14.06.2011 um 11:21 Uhr
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
Bitte warten ..
Mitglied: Headshot
14.06.2011 um 14:29 Uhr
Ich habe eine Lösung gefunden Anhand eines eingefügten Schalters:
01.
 
02.
Sub Auslesen() 
03.
 
04.
Dim STEPS As String 
05.
Dim JOB_ID As String 
06.
Dim JOB_NAME As String 
07.
Dim TCB As Double 
08.
Dim DATUM As Date 
09.
Dim j As Long 
10.
Dim S As Boolean 
11.
Dim ExcelSheet As Object 
12.
Dim Dateiname As String 
13.
Dim fso As Object 
14.
 
15.
 
16.
Dateiname = "H:\Ref_92\Kontny\G2719V00.txt" 
17.
 
18.
Set ExcelSheet = CreateObject("excel.application").Workbooks.Open(Filename:=Dateiname) 
19.
 
20.
Set fso = CreateObject("Scripting.FileSystemObject") 
21.
Set f = fso.getFile("H:\Ref_92\Kontny\G2719V00.txt") 
22.
Set f = f.OpenAsTextStream(1) 
23.
 
24.
 
25.
 
26.
j = 0 
27.
Do While Not f.AtEndOfStream 
28.
l = f.ReadLine() 
29.
If InStr(1, l, "----") <> 0 Then 
30.
textbox3 = Mid(l, 25, 22) 
31.
End If 
32.
 
33.
If InStr(1, l, "STEPNAME") <> 0 Then 
34.
S = True 
35.
End If 
36.
 
37.
If InStr(1, l, "ENDED") <> 0 Then 
38.
S = False 
39.
End If 
40.
 
41.
 
42.
If InStr(1, l, "-") <> 0 And S = True Then 
43.
Textbox4 = Mid(l, 22, 9) 'Es kommt immer nur der Letzte Eintrag Raus 
44.
 
45.
Textbox5 = Mid(l, 60, 5) 'Es kommt immer nur der Letzte Eintrag Raus 
46.
 
47.
End If 
48.
 
49.
If InStr(1, l, "$HASP373") <> 0 Then 
50.
textbox1 = Mid(l, 30, 8) 
51.
textbox2 = Mid(l, 11, 8) 
52.
 
53.
j = j + 1 
54.
 
55.
Sheets("Tabelle1").Cells(j + 1, 2).Value = textbox1 
56.
Sheets("Tabelle1").Cells(j + 1, 1).Value = textbox2 
57.
Sheets("Tabelle1").Cells(j + 1, 3).Value = textbox3 
58.
Sheets("Tabelle1").Cells(j + 1, 4).Value = Textbox4 
59.
Sheets("Tabelle1").Cells(j + 1, 5).Value = Textbox5 
60.
 
61.
End If 
62.
 
63.
Loop 
64.
 
65.
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^^
Bitte warten ..
Mitglied: bastla
14.06.2011 um 22:42 Uhr
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:
01.
'... 
02.
Const Delim As String = "_" 
03.
 
04.
j = 1 
05.
Do While Not f.AtEndOfStream 
06.
    l = f.ReadLine 
07.
	 
08.
    If InStr(l, "----") <> 0 Then textbox3 = Mid(l, 25, 22) 
09.
 
10.
    If InStr(l, "STEPNAME") <> 0 Then 
11.
        S = True 
12.
        Textbox4 = "" 
13.
        Textbox5 = "" 
14.
    End If 
15.
 
16.
    If InStr(l, "ENDED") <> 0 Then S = False 
17.
 
18.
    If InStr(l, "-") <> 0 And S = True Then 
19.
        Textbox4 = Textbox4 & Delim & Mid(l, 22, 9) 'an den bisherigen Inhalt mit "Delim" getrennt anfügen 
20.
        Textbox5 = Textbox5 & Delim & Mid(l, 60, 5) 
21.
    End If 
22.
 
23.
    If InStr(l, "$HASP373") <> 0 Then 
24.
        textbox1 = Mid(l, 30, 8) 
25.
        textbox2 = Mid(l, 11, 8) 
26.
 
27.
        j = j + 1 
28.
 
29.
        With Sheets("Tabelle1") 
30.
            .Cells(j, 2).Value = textbox1 
31.
            .Cells(j, 1).Value = textbox2 
32.
            .Cells(j, 3).Value = textbox3 
33.
            .Cells(j, 4).Value = Mid(Textbox4, Len(Delim) + 1) 
34.
            .Cells(j, 5).Value = Mid(Textbox5, Len(Delim) + 1) 
35.
        End With 
36.
    End If 
37.
 
38.
Loop 
39.
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
Bitte warten ..
Mitglied: Headshot
15.06.2011 um 02:03 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...