simples parsen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

simples parsen

Beitrag von diGGa »

ho
ich hoffe ich wähle den richtigen begriff.

ich hab ne textdatei die in etwa so aufgebaut ist:

Code: Alles auswählen

; ----------------------------------------------------------------------------
; Autogenerated on : 12-06-2005 17:23:27
; From files       : 'x.sav' & 'x.sad' & 'x.rpl'
; File encoding    : utf-8
; ----------------------------------------------------------------------------

[Common]
TotalGameTime = 249,398293
SelectedMap   = "55f155af158fe4263f819707873fcd29$46056"
IsCustomMap   = True
PlayerCount   = 2

[Player0]
PlayerName   = "Joe"
Avatar       = "avatar2"
Rank         = 333
SelectedSide = CS
Color        = [140, 2, 180, 255]

[Player1]
PlayerName   = "Doe"
Avatar       = "avatar2"
Rank         = 333
SelectedSide = TFT
Color        = [50, 212, 40, 255]
dabei variiert wieviele player blöcke vorhanden sind.. 2-8 eben. könnte ich ein simples beispiel haben wie man so etwas ausliest? am besten in arrays(anders gehts wohl garnicht)
also das man
PlayerName(0) = "Joe"
hat und so etc etc

das ganze ist wahrscheinlich ziemlich simpel xD habs mit php aber auch schon nich begriffen aber jetz will ichs einfach packen. währe echt cool wenn ihr mir da n denkanstoß geben könntet.
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag von Hroudtwolf »

Ein deftiger Verweis auf die Preferences-Lib. ;-)
Siehe PureBasic-Hilfe.
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag von Green Snake »

genau, mir pref kannst du das ohne mühe auslesen, du gibst nur das richtige schlüsselwort (keyword) an, und den entsprächenden wert.
dann kannst du das mittels readpreferance ganz easy auslesen. :allright:
für weitere infos siehe pb help

:allright:
-.-"
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

Beitrag von diGGa »

hätt ja jetz gedacht das man das mit string befehlen auslesen muss :/ naja man lernt immer dazu^^ auf bald dann bis ich dazu fragen hab xD
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag von FGK »

Hi DiGGa,

hier ne mögliche Lösung für dein Problem. Du lernst zwar nix dabei wenn du es dir net selber erarbeitest, aber ich hatte gerade Lust und Zeit dazu.
Den Pfad in #Filename anpassen. Die Umwandlung der Werte in ihre richtigen Variablentypen hab ich nicht bei allen schon gemacht. Aus Bequemlichkeit hab ich solche wie Color als String belassen. Mußt halt selber noch die R,G,B Werte raussplitten.

Viel Spaß damit

Gruß

FGK


Code: Alles auswählen

;
; Game Daten lesen
;

#Filename = "D:\PROJEKTE\Pure_SRC\BoardPosts\GameInfo.txt"

Structure GameInfo
  TotalGameTime.f               ;= 249,398293 
  SelectedMap.s                 ;= "55f155af158fe4263f819707873fcd29$46056" 
  IsCustomMap.s                 ;= True 
  PlayerCount.l                 ;= 2
EndStructure

Structure PlayerInfo
  PlayerName.s                  ;= "Joe" 
  Avatar.s                      ;= "avatar2" 
  Rank.l                        ;= 333 
  SelectedSide.s                ;= CS 
  Color.s                       ;= [140, 2, 180, 255] 
EndStructure

NewList PlayerTab.PlayerInfo() 

  If OpenPreferences(#Filename)
    If PreferenceGroup("Common")
      Game.GameInfo\TotalGameTime=ValF(ReplaceString(ReadPreferenceString("TotalGameTime",""),",","."))
      Game.GameInfo\SelectedMap=ReadPreferenceString("SelectedMap","")
      Game.GameInfo\IsCustomMap=ReadPreferenceString("IsCustomMap","False")
      Game.GameInfo\PlayerCount=ReadPreferenceLong("PlayerCount","0")

      Debug Game.GameInfo\TotalGameTime
      Debug Game.GameInfo\SelectedMap
      Debug Game.GameInfo\IsCustomMap
      Debug Game.GameInfo\PlayerCount
    EndIf
    
    If Game.GameInfo\PlayerCount>0
      For I= 0 To Game.GameInfo\PlayerCount-1
        AddElement(PlayerTab())
        If PreferenceGroup("Player"+Str(I)) 
          PlayerTab()\PlayerName=ReadPreferenceString("PlayerName","")
          PlayerTab()\Avatar=ReadPreferenceString("Avatar","")
          PlayerTab()\Rank=ReadPreferenceLong("Rank","")
          PlayerTab()\SelectedSide=ReadPreferenceString("SelectedSide","")
          PlayerTab()\Color=ReadPreferenceString("Color","[0,0,0,0]")
     
          Debug "Player"+Str(I)
          Debug PlayerTab()\PlayerName
          Debug PlayerTab()\Avatar
          Debug PlayerTab()\Rank
          Debug PlayerTab()\SelectedSide
          Debug PlayerTab()\Color
        EndIf  
      Next I
    EndIf
    ClosePreferences()
 EndIf 

End 
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

Beitrag von diGGa »

habs nur kurz überflogen.. komm drauf zurück wenn ich nich weiterkomm trotzdem danke

////

Code: Alles auswählen

If OpenPreferences("x.txt") 
       
       If PreferenceGroup("Common")
              TotalGameTime.f = ValF(ReadPreferenceString("TotalGameTime", "-"))
              SelectedMap.s = RemoveString(ReadPreferenceString("SelectedMap", "-"),Chr(34))  
              IsCustomMap.s = ReadPreferenceString("IsCustomMap", "0")
              PlayerCount.l = ReadPreferenceLong("PlayerCount", "0")
              
              Dim PlayerName.s(PlayerCount)
              Dim Avatar.s(PlayerCount)
              Dim Rank.l(PlayerCount)
              Dim SelectedSide.s(PlayerCount)
             
              MessageRequester("debug","TGT: " + Str(TotalGameTime) + Chr(13) + "SM: " + SelectedMap + Chr(13) + "ICM: " + IsCustomMap + Chr(13) + "PC: " + Str(PlayerCount))
       EndIf
       
       For GroupIdent=0 To PlayerCount-1
              If PreferenceGroup("Player"+Str(GroupIdent))
                     PlayerName(GroupIdent) = RemoveString(ReadPreferenceString("PlayerName", "-"),Chr(34))
                     Avatar(GroupIdent) = RemoveString(ReadPreferenceString("Avatar", "-"),Chr(34))
                     Rank(GroupIdent) = ReadPreferenceLong("Rank", "0")
                     SelectedSide(GroupIdent) = ReadPreferenceString("SelectedSide", "-") 
              EndIf
       Next
       
       For GroupIdent=0 To PlayerCount-1
              Debug ""
              Debug "======== Player ========"
              Debug GroupIdent
              Debug PlayerName(GroupIdent)
              Debug Avatar(GroupIdent)
              Debug Rank(GroupIdent)
              Debug SelectedSide(GroupIdent)
       Next
       
       ClosePreferences()
Else
       MessageRequester("debug","file not found")
EndIf

sind listen schneller? weil mit arrays gehts ja auch gut und mich störts nich xD
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag von Thalius »

1. Ja man kann das ganze mit String befehlen parsen, jedoch die Preferences befehle nehmen dir ne Menge Arbeit ab hierbei. Ein anderer Weg sind auchnoch WinAPI Funktionen ( von denen ich nach und nach wegkomme, da ich pers. gerne Progs schreibe die ich auch unter Linux kompilieren kann ) :)

ps. Gugg dir mal paar Beispiele im CodeArchiv an. Da hats einige Stringparse Sources.

2. Listen sind langsamer, aber komfortabler ( speziell wenn du Elemente löschen/ verschieben etc. willst ). Wenns mit Arrays geht tendiere ich dazu auch diese zu verwenden. Ansonsten machs so wie dus für effektiver ( zeit & performance ) hälst.

MfG, Thalius
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Der Unterschied zwischen Listen und Arrays fällt nicht mehr auf, wenn man dazwischen Dateioperationen benutzt. Aber auch sonst sind Arrays zwar da schneller, aber LinkedLists wieder wo anders.
Antworten