Auslesen einer Textdatei mit unterschiedlichen Formaten

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Cell.

    Auslesen einer Textdatei mit unterschiedlichen Formaten

    Hallo liebe Community,
    habe schon viel in euerm Forum gestöbert und bin echt begeistert :) Als echter ".NET Noob" habe ich mich zwar schon in einiges Reinfuchsen können (hier speziell um das Auslesen von Textdateien), allerdings stoße ich bei folgendem Problem an meine Grenzen:

    Es geht darum eine Textdatei mit sehr unterschiedlichen Datenformaten auszulesen. Hier ein Beispiel:

    Quellcode

    1. Import File = none
    2. File Load Date/Time = none
    3. Start Date/Time = 24.02.2015 11:34:26,469
    4. Hit other Team (by gun),5
    5. Hit other Team (on gun),-3
    6. Hit own Team (by gun),-5
    7. Hit own Team (on gun),-3
    8. Hit by HB etc,2
    9. Hit on HB etc (non-fatal),-1
    10. Hit on HB etc (fatal),-5
    11. Shots Fired,0
    12. 0,20,-1,-1,0
    13. Plyr 01,Plyr 01,1,0
    14. Plyr 02,Plyr 02,2,0
    15. Plyr 02, Pack 2, 5, 1, hit Plyr 01, Pack 1, 5, 0, 11:34:43 (SI=1)
    16. MineFatal,-,Plyr 02,5,1,11:34:44
    17. Plyr 01, Pack 1, 4, 2, hit Plyr 02, Pack 2, 5, 1, 11:36:34 (SI=2)
    18. Grenade,-,Plyr 01,89,0,11:34:53
    19. Plyr 02, Pack 2, 4, 1, hit Plyr 01, Pack 1, 4, 2, 11:36:52 (SI=1)
    20. Finish Date/Time = 24.02.2015 11:37:02
    21. Shots Fired Data:
    22. Plyr 01,2
    23. Plyr 02,2


    Folgendes möchte ich damit machen:
    Bei Form_Load() einmalig auslesen: Startzeit, Game, Hits
    Zeile 4:
    starttime AS date (24.02.2015 11:34:26)
    game AS string (469)
    Zeile 6-13:
    hits AS integer() (5,-3,-5,-3,2,-1,-5,0)

    Und dann über ein Timer.Tick-Event sekündlich (die Datei wird während des Spiels weiter geschrieben):
    Zeilen ?-?: (im Beispiel 19-23; die Anzahl der Player ist jedoch variabel (bis zu 40)
    Hier muss geprüft werden um welchen Eintrag es sich handelt (Hit, MineFatal, Grenade) und jeweils die ganze Zeile in ein Array zeile() geschrieben werden. Dann nutze ich eine Schleife um die Punkte zu berechnen.
    Zeilen ?-?:
    Auch hier möchte ich mittels einer Schleife das zeilenweise geschriebene Array shotsfired() auswerten.

    Habe hier etliche Antworten zu Textdateien mit Separatoren und festen Feldbreiten gefunden; bei diesen extrem variablen Datenformaten bekomme ich aber keinen Dreh dran. Vielleicht könnt ihr mir ja helfen?

    Besten Dank im Voraus!

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

    Ich gehe davon aus das du die Textdatei Zeilenweise auslesen willst. Also mittels eines Streamreaders Zeile für Zeile in eine String Variable schreibst.

    Dann könntest du ab Zeile 19 die StartsWith funktion benutzen

    VB.NET-Quellcode

    1. dim sr as StreamReader = New StreamReader("Pfad zu deiner Datei")
    2. Dim i as integer = 1
    3. dim sline as string
    4. do
    5. sline = sr.ReadLine
    6. if i > 18 Then
    7. if sline.StartsWith("Plyr") Then
    8. 'Hier werden diese Zeilen ausgewertet: Plyr 02, Pack 2, 4, 1, hit Plyr 01, Pack 1, 4, 2, 11:36:52 (SI=1)
    9. Else
    10. If sline.Contains("MineFatal")
    11. 'hier werden Mienen ausgewertet
    12. Elseif sline.Contains("Grenade")
    13. 'hier werden Granaten ausgewertet
    14. Else
    15. Endif
    16. EndIf
    17. Endif
    18. i = i +1
    19. loop Until sr.endOfStream



    Der Code wurde nicht getestet... habe ich schnell aus dem kopf hingekleistert ;)

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

    Dann könnte man die Bereiche durch die Leerzeilen voneinander Trennen.


    VB.NET-Quellcode

    1. if sline = "" Then
    2. 'Jetzt kommt der nächste bereichsBlock
    3. endif


    Dann könnte man im Berechsblock 3 Alle Spieler die aufgeführt werden in ein Array oder ein List of String schreiben

    im Bereichsblock 4 könnte man die Zeilen dann Differenzieren indem man auf , Splittet und dann den Eintrag 0 prüft. ist es ein Spielername der in deinem Array / Liste vorhanden ist weist du bescheid.

    Alternativ kannst du im Bereich 4 über , Splitten und dann die Länge des Array zum Differenzieren benutzen

    VB.NET-Quellcode

    1. dim spalte() as string
    2. splate = Split(sline,",")
    3. if spalte.Length = 9 Then
    4. 'Plyr 02, Pack 2, 5, 1, hit Plyr 01, Pack 1, 5, 0, 11:34:43 (SI=1)
    5. else
    6. 'alle anderen Zeilen... hier kannst du wieder in einer weiteren If oder Select Case Abfrage die anderen Zeilen auswerten
    7. endif