Textdateien parsen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

babywolf

Betreff: Textdateien parsen

BeitragDi, Jun 07, 2005 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo an alle,

Ich bin neu hier und bin aus zufall über Blitzbasic gestolpert. Da ich Basic noch aus meinen VC 20 und VC 64 er Zeiten kannte dachte ich mal probierst du ein wenig rum. Da ich für ein Onlinespiel was ich gerne Spiele schon immer ein eigenes Tool haben wollte versuche ich mich gerade daran es mit blitzbasic umzusetzen.

Ich bin also absoluter Anfänger was programmieren angeht. Habe mir teilweise schon Robs tuturial durchgelesen(sehr schön geschrieben).

Mein Tool soll evtl mal irgendwann ein Kartentool werden um die ganzen sachen die dort so passieren zu verwalten. (Das Spiel heißt übrigens Droidwars)

Nun Stellt der Anbieter des Spiels eine Täglich neu erstellte kartendatei zu Verfügung wo die öffentlichen Daten der spieler mit Koordinaten usw drinn stehen.

Mein Problem war also, wie lese ich die Daten aus um sie brauchbar zu verwerten.

Keine Angst ich möchte hier keine Fertigen Lösungen von euch Very Happy

Die Daten sind folgendermaßen aufgebaut in der Datei:

"6";"fohmt";"fohmt";"senza torre";"Lance Corporal";"0";
"9";"The_Odo666";"Terra";"FMF";"Warrant-Officer";"0";

Also jede Zeile ein Datensatz.

Ich habe das für mich jetzt schon ganz gut gelöst wenn man bedenkt das ich erst seit 4 Tagen mich mit blitzbasic beschäftige.

Ich würde jetzt gerne nur von euch wissen ob es evtl auch eleganter und einfacher geht.

Hier mal mein Quelltext:




Code: [AUSKLAPPEN]

;Parser Version 0.01
;Diese Routinge Soll aus der ersten Zeile der karten.txt die Daten Parsen und darstellen
;
; Dies ist ein kleiner Test
; Als erstes öffnen wir die karten.txt
; Aufbau der Daten in der karten.txt
; "6";"fohmt";"fohmt";"senza torre";"Lance Corporal";"0";
; Omni Commander Basisname Clan Rank quad

karte = ReadFile ("D:\Eigene Projekte\Dwarsinfotools\karten.txt")

; eine Zeile aus der datei karten.txt auslesen

zeile$ = ReadLine (karte)

; Ermittel die länge der ausgelesenen Zeile

laenge =Len (zeile$)

; ausgabe der länge auf dem Bildschirm

Print laenge
;hier definiere ich die Start und Endposition in der Zeile für die einzelnen Daten
Omstart    = 0   ; Omni Starposition
Omende      = 0   ; Omni Endposition
Commstart   = 0 ; Commander Startposition
Commend      = 0 ; Commander Endposition
Basisstart   = 0   ; Basisstartposition
Basisend   = 0 ; Basisendposition
Clanstart   = 0 ; Clanstartposition
Clanend      = 0 ; Clanendposition
Rankstart   = 0 ; Rankstartposition
Rankend      = 0 ; Rankendposition
Quadstart   = 0 ; quadrantstartposition
Quadend      = 0 ; Quadrantendposition
zaehler    = 0 ; allgemeiner Zähler
contr      = 0 ; Controllvariable eine andere möglichkeit ist mir im moment nicht eingefallen

For i = 1 To laenge+1

buchstabe$ = Mid$ (zeile$, i,1)

;Print buchstabe$

Code = Asc (buchstabe$)

If code = 34 Then zaehler = zaehler+1 contr = 1

   ; Hier wird die Omni ermittelt
   
   If zaehler = 1 And contr = 1 Then omstart= i+1 contr = 0
   If zaehler = 2 And contr = 1 Then omende = i contr = 0
   
   
   ; Hier der Commandername
   
   If zaehler = 3 And contr = 1 Then commstart = i+1 contr = 0
   If zaehler = 4 And contr = 1 Then commend = i contr = 0
   
   
   
   ; hier der Basisname
   
   If zaehler = 5 And contr = 1 Then basisstart = i+1 contr = 0
   If zaehler = 6 And contr = 1 Then basisend = i contr = 0
   
   ; Hier der Clanname
   
   If zaehler = 7 And contr = 1 Then clanstart = i+1 contr = 0
   If zaehler = 8 And contr = 1 Then Clanend = i contr = 0
   
   ; Hier der Rank
   
   If zaehler = 9 And contr = 1 Then Rankstart = i+1 contr = 0
   If zaehler = 10 And contr = 1 Then Rankend = i contr = 0
   
   ; und hier der Quadrant
   
   If zaehler = 11 And contr = 1 Then Quadstart = i+1 contr = 0
   If zaehler = 12 And contr = 1 Then Quadend = i contr = 0


Next

; jetzt schnell noch die zeichenlänge für die Daten ermitteln

   ; für die Omni

   Omlang = omende - omstart
   
   ; und jetzt in den string schreiben
   
   Omni$ = Mid$ (zeile$, omstart,omlang)

      ; für den Commander Namen
      
      commlang = commend - commstart
      
      comm$ = Mid$ (zeile$, commstart,commlang)

         ; für den Basisnamen
         
         baselang = basisend - basisstart
         
         base$ = Mid$ (zeile$, basisstart,baselang)

         ; für den Clannamen
         
         clanlang = clanend - clanstart
         clan$ = Mid$ (zeile$, clanstart,clanlang)
         
            ;für den Rank
            ranklang = rankend - rankstart
            Rank$ = Mid$ (zeile$, rankstart,ranklang)
            
               ;für den Quadranten
               quadlang = quadend - quadstart
               quad$ = Mid$ (zeile$, quadstart,quadlang)
                  
; Ausgeben der Daten

Print "Omni            : "+Omni$
Print "Commander   : "+comm$
Print "Basis         : "+base$
Print "Clan            : "+clan$
Print "Rank            : "+rank$
Print "Quadrant      : "+quad$


CloseFile ("D:\Eigene Projekte\Dwarsinfotools\karten.txt")

WaitKey   


Ich bin da echt mal gespannt, denke allerdings das ich wohl zu umständlich programmiert habe.

Außerdem stellt sich für mich noch die frage wie ich das ganze in Variabeln speichere denke mal da ist wohl dim mein freund.

besten gruß Babywolf
 

CodeMaster

BeitragDi, Jun 07, 2005 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Tja, also es geht wirklich *etwas* kürzer...BlitzBasic: [AUSKLAPPEN]
Const p_Omni = 1
Const p_Commander = 2
Const p_Basis = 3
Const p_Clan = 4
Const p_Rank = 5
Const p_Quad = 6

Dim eintrag$(6)

test$ = \"'6';'fohmt';'fohmt';'senza torre';'Lance Corporal';'0';\"
parameter = p_Omni

For i = 1 To Len(test$)
buffer$ = Mid(test,i,1)
Select buffer
Case \"'\"; Chr(34)
schreiben = 1 - schreiben
Case \";\"
If Not schreiben Then parameter = parameter + 1
Default
If schreiben Then eintrag(parameter) = eintrag(parameter) + buffer
End Select
Next

Print eintrag(p_Omni)
Print eintrag(p_Commander)
Print eintrag(p_Basis)
Print eintrag(p_Clan)
Print eintrag(p_Rank)
Print eintrag(p_Quad)
Hab statt Doppelstrichen (") einfache Striche (') verwendet, um auf die Schnelle einen Beispielstring zu testen. Müsste noch geändert werden.
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102
 

babywolf

BeitragDi, Jun 07, 2005 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, erstmal danke für die schnelle Antwort.

Im groben verstehe ich die kurze Variante Laughing aber habe noch ein paar verständiss probleme, besonders mit :

schreiben = schreiben -1 und den darauffolgenden Abfragen. Im grunde spare ich mir bei deiner Variante das ganze zuweisen mit den Start und Endpunkten um dann über Mid$ alles in die Variabeln zu speichern, wenn ich das richtig verstanden habe schreibst du gleich jedes zeichen rein bis zum " ' ".

Ich würde deine Routine ja gerne übernehmen aber es sträubt sich bei mir einfach was zu nehmen was ich nicht zu 100% verstanden habe Smile

Das zweite Problem was ich damit habe ist ich bin ja auf die " " hier angewiesen, also dachte ich ich wandel buffer mal um in eine Zahl also so

Code: [AUSKLAPPEN]
For i = 1 To Len(test$)
 buffer$ = Mid(test,i,1)
 
 Code = Asc (buffer$)

 Select code
  Case code = 34 ; Chr(34)
   schreiben = 1 - schreiben
  Case code = 59
   If Not schreiben Then parameter = parameter + 1
  Default
   If schreiben Then eintrag(parameter) = eintrag(parameter) + buffer
 End Select
Next


Aber das funktioniert nicht wirklich. Ist sicherlich ein denkfehler von mir. Werde wohl mal drüber schlafen müssen.

Ich möchte auch nicht unbedingt eine fertige Lösung haben es reicht mir ja schon wenn man mir meinen Fehler aufzeigt oder ein Stichwort gibt, wenn ich es dann immernoch nicht verstehe naja dann Smile

Ich glaube ich bin zu alt um nochmal Basic zu lernen. Embarassed

Und noch eine Frage habe ich. Ich will ja nun nicht wirklich ein Spiel Programmieren ist Blitzbasic denn wirklich geeignet dafür oder ist es nur ausgelegt auf spiele? Ich denke doch das auch Spiele viel mit Daten umgehen müssen und daher sollte es doch wohl egal sein, solange ich mit der Programmiersprache gut zurecht komme.

Also noch mal Danke für so eine schnelle Antwort. Bis jetzt kann ich nur sagen super hier im Forum.

mfg Babywolf
 

CodeMaster

BeitragMi, Jun 08, 2005 7:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist nicht nötig, das Char in eine Zahl umzuwandeln. Dein Code funktioniert deshalb nicht, weil du in "Code" die Ascii-Zahl des Teilstrings speicherst, im String jedoch die leere Variable "Buffer" hinzufügst. Nach deiner Variante müsste das "if schreben then eintrag(parameter) = eintrag(parameter) + chr(code)" lauten.
Ich hatte ja die Abfrage für Doppelstriche bereits eingebaut, aber noch auskommentiert zu testzwecken. Mit "Case Chr(34)" funktioniert's.

"schreiben = 1 - schreiben" bewirkt, dass sich bei jedem Durchlauf der Zustand von "schreiben" von 0 auf 1 oder von 1 auf 0 ändert. Es soll ja nur das gespeichert werden, was in Anführungszeichen steht.
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group