VB6 Datei komplett auslesen und Teilstring extrahieren

fixmer

Grünschnabel
hallo,

ich habe erst vor kurzen angefangen mit vb6 zu programmieren. eigentlich komme ich eher aus der php ecke.

ich versuche zur zeit ein script zu schreiben was unteranderem eine datei rückwärts einliest. nun möchte ich das wenn ich die datei eingelesen habe einen bestimmte teil herausfiltern mit dem ich weiterarbeiten muss/möchte.

die textdatei ist immer wie folgt aufgebaut:

Code:
******* [forlaufende nummer] End *******
Data1
Data2
Data3
Data4
***** [fortlaufende nummer] start *****

******* [forlaufende nummer] End *******
Data1
Data2
Data3
Data4
***** [fortlaufende nummer] start *****

usw...

eine textdatei besteht aus vielen solcher einträge die fortlaufend aneinander gereit sind.

ich bin soweit das ich die komplette datei in eine variable schreibe.ich möchte nun alles von "******* [forlaufende nummer] End *******" bis "***** [fortlaufende nummer] start *****" extrahieren und prüfen ob data3 einen gewissen wert. sollte der wert nicht gefunden werden soll mit dem nächsten eintrag genauso verfahren werden.
ich scheitere im moment wo ich das komplette file in die einzelnen bereiche splitten möchte. meine bisherige funktion sieht so aus:

Code:
Public Function GetLastHand(TableName As String)

    Dim HandHistoryFile As String
    Dim ReadHHDir As String
    Dim asHands() As String
    Dim CheckSum As Integer
    
    'falls die funktion GetTableName keinen tisch findet abbrechen
    If TableName = "" Then
        Exit Function
    End If
    
    'progdir lesen und string zusammenfügen
    ReadHHDir = IniRead("Settings", "ProgramDir")
    BetfairHHDir = ReadHHDir & "\"
    
    'dateinamen zusammensetzen
    HandHistoryFile = BetfairHHDir & FindHHFile
    iFile = FreeFile

    'datei einlesen
    Open HandHistoryFile For Input As #iFile
        asHands = Split(Input(LOF(iFile), #iFile), vbCrLf)
    Close #iFile
      
    For iFile = UBound(asHands) To LBound(asHands) Step -1
    
        'schaen ob unser trennzeichen vorkommt
        CheckSum = InStr(1, asHands(iFile), " *****", 1)
        
        
        For CheckSum = 0 To CheckSum = 1
             FileOutput = FileOutput & asHands(iFile) & vbCrLf
        Next
        
    Next
    
    'hh file ausgeben
    Grabber.txtOutput.Text = FileOutput

End Function

könnte mir bitte jemand einen denkanstoß geben wie ich mein vorhaben am besten realisieren kann?

ich hoffe meine erklärung war halbwegs verständlich.

vielen dank für eure hilfe.


mfg fixmer
 
Hallo, hier ein Beispiel:
Visual Basic:
Dim FNr As Integer
Dim DateiInhalt As String
Dim Abschnitt() As String
Dim Zeile() As String

  FNr = FreeFile

  'Datei komplett einlesen
  Open "d:\Test.txt" For Input As #FNr
    DateiInhalt = Input(LOF(FNr), #FNr)
  Close #FNr

  ' Abschnitte splitten
  Abschnitt = Split(DateiInhalt, "***** [")
  
  For N = 0 To UBound(Abschnitt)
    ' Zeilen splitten
    Zeile = Split(Abschnitt(N), vbCrLf)
      If Not UBound(Zeile) < 4 Then ' Prüfen ob mindestens 4 Zeilen vorhanden sind
        If Zeile(3) = "Data3" Then ' Statt Data3 den gesuchten Wert angeben
          MsgBox Zeile(3) ' Mach was
        End If
      End If
  Next
 
hallo wincnc,



erstmal vielen dank für deine hilfe.

ich muss die datei rückwärts einlesen da in die datei immer neue abschnitte ans ende dieser datei geschrieben werden. ich möchte nur die letzten paar abschnitte auf meinen gesuchten data3 wert überprüfen. ein abchnitt mit dem gesuchten wert in data3 kann auch mehrmals in der gesamten datei vorkommen. mich interessiert aber nur das letzte vorkommen in der datei.

ich hatte auch vergessen zu erwähnen das zum einen die datenreihen im gewünschten abschnitt nicht immer genau vier sind. es können auch einige mehr sein. einen festen wert gibt es da nicht. das einzige was immer sicher ist, ist das data3 immer drei reihen über dem ende eines abschnittes liegen.

wie ich dieses aber bewerkstelligen kann weiß ich leider nicht. ich bin über jede hilfe sehr dankbar.

mfg fixmer
 
Dann versuch´s mal so:
Visual Basic:
Dim FNr As Integer
Dim DateiInhalt As String
Dim Pos As Integer
Dim Zeile() As String

  FNr = FreeFile
      
  'Datei komplett einlesen
  Open "d:\Test.txt" For Input As #FNr
    DateiInhalt = Input(LOF(FNr), #FNr)
  Close #FNr
      
  ' letztes vorkommen von "] End *" suchen
  Pos = InStrRev(DateiInhalt, "] End *")
 
  MsgBox Mid(DateiInhalt, Pos)
  
  Zeile = Split(Mid(DateiInhalt, Pos), vbCrLf)
  
  MsgBox Zeile(3)
 
hallo wincnc,

erstmal entschuldigung. ich glaube ich habe in meinem eingangspost nicht alle relevanten daten, wie das textfile aufgebaut ist, gepostet.

ein abschnitt in dem textfile sieht so aus:

Code:
***** Betfair Poker Hand History for Game 327435909 *****
NL $0.10/$0.20 Texas Hold'em - Saturday, March 15, 20:26:46 GMT 2008
Table Sodium 02 6-max (Real Money)
Seat 3 is the button
Total number of active players : 5
Seat 1: asdds123 ( $21.08 )
Seat 2: FTOmmm1 ( $14.66 )
Seat 3: 123455 ( $11.23 )
Seat 4: smokedog ( $11.77 )
Seat 5: lxdisco ( $20 )
Seat 6: fukit ( $13.27 )
smokedog posts small blind [$0.10]
fukit posts big blind [$0.20]
** Dealing down cards **
asdds123 folds
FTOmmm1 folds
123455 calls [$0.20]
smokedog raises to [$0.40]
fukit calls [$0.20]
123455 calls [$0.20]
** Dealing Flop ** [ Jc, Td, Ah ]
smokedog checks
fukit checks
123455 checks
** Dealing Turn ** [ Ts ]
smokedog bets [$1.20]
fukit folds
123455 raises to [$2.40]
smokedog calls [$1.20]
** Dealing River ** [ 5c ]
smokedog bets [$6]
123455 goes all-in
123455 raises to [$8.43]
smokedog calls [$2.43]
** Showdown ** 
123455 shows [ 8c, As ] two pair, Aces and Tens
smokedog shows [ 8h, Kc ] a pair of Tens
** Hand Conclusion **
123455 wins $21.72 from main pot with two pair, Aces and Tens
************  Game 327435909 ends  ************

die anzahl der zeilen zwischen der ersten und letzten zeile kann immer anders sein. ich möchte von oben aus gesehen in der dritten zeile nach einem bestimmten wort/string suchen hier in diesem bsp wäre die zeile "Table Sodium 02 6-max (Real Money)". in dem textfile kommen mehrere abschnitte vor, wo dieses wort bzw string vorkommt. ich möchte aber den abschnitt herausfilter und ausgeben der als letztes in dem textfile mit dem gewünschten wort/string vorkommt.

wie könnte man sowas realisieren? ich habe mit deinen beiden beispielen oben schon herumexperimentiert, aber leider keine lösung für das problem finden können.

vielen dank für deine hilfe.

mfg fixmer
 
Hallo

Wenn das gesuchte immer in der 3. Zeile vom Abschnitt steht, dann funktioniert das so:
Visual Basic:
Dim FNr As Integer
Dim DateiInhalt As String
Dim Pos As Long
Dim Zeile() As String
  
  FNr = FreeFile
        
  'Datei komplett einlesen
  Open "d:\Test.txt" For Input As #FNr
    DateiInhalt = Input(LOF(FNr), #FNr)
  Close #FNr
        
  ' letztes vorkommen von "***** Betfair" suchen
   Pos = InStrRev(DateiInhalt, "***** Betfair")
   Zeile = Split(Mid(DateiInhalt, Pos), vbCrLf)
   MsgBox Zeile(2)
 
Zuletzt bearbeitet:
hallo wincnc,

mit deinem letzten beispiel bekomme ich einen überlauf in folgender zeile:

Code:
Pos = InStrRev(DateiInhalt, "***** Betfair")


mfg fixmer
 
Hallo

Fast Du die Variable Pos als Long deklariert?
Wie groß ist die Datei?
Code:
Dim Pos As Long
 
hallo wincnc,

das problem lag, wie bereits von dir vermutet an der deklaration der variable Pos. diese hatte ich noch als integerwert deklariert.

die textdatei ist knappe 900kb groß. in der regel haben die txtfiles eine größe von 700kb-1,5mb.

mit deinem letzten beispiel wird die letzte hand ausgefiltert. vielen dank für deine hilfe.


mfg fixmer
 

Neue Beiträge

Zurück