Textdateien parsen
Übersicht

babywolfBetreff: Textdateien parsen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Tja, also es geht wirklich *etwas* kürzer...BlitzBasic: [AUSKLAPPEN] Const p_Omni = 1Hab 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey, erstmal danke für die schnelle Antwort.
Im groben verstehe ich die kurze Variante ![]() 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 ![]() 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 ![]() Ich glaube ich bin zu alt um nochmal Basic zu lernen. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group