[GELÖST] String aus Datei auslesen und "aufsplitten&quo

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] String aus Datei auslesen und "aufsplitten&quo

BeitragSa, Nov 26, 2011 1:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
habe mal wieder ein Problem: Ich bastle gerade einen ScriptReader für "Undead Cut Down". Nun sieht die Anordnung im Script wie folgt aus:
Code: [AUSKLAPPEN]
vname=Peter
nname=Carlson

Dazu habe ich nun schon folgenden Code geschrieben, komme aber nicht weiter:
BlitzMax: [AUSKLAPPEN]
Type char
Field vname:String
Field nname:String
Field sname:String
Field title:String
Field modelfile:String
Field aitype:String
Field id:String
End Type

Function ReadCharDesc:Int(file:String)
Local descfile:TStream
descfile = ReadFile(file)
Local befehl:String
Local newchar:char = New char
Repeat
befehl = ReadLine(descfile)
If(Left(befehl, 6) = "vname=")
newchar.vname = 'Was soll hier hingeschrieben werden?
EndIf
Until Eof(descfile)
Return 1
End Function


Da wo die Zeile mit dem Kommentar ist, da liegt das Problem. Ich hoffe ihr könnt mir helfen.

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Mo, Nov 28, 2011 21:52, insgesamt 2-mal bearbeitet

DaysShadow

BeitragSa, Nov 26, 2011 1:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast verschiedene Möglichkeiten:

BlitzMax: [AUSKLAPPEN]
SuperStrict

Global v:String = "vname=Peter"

Print( Right( v, v.length - 6 ) ) 'Hier fängt man quasi am Ende des Strings an und nimmt n Zeichen nach links
Print( Mid( v, 7, v.length - 5 ) ) 'Fang an der 7.Stelle an und nimm length - 5 Zeichen
Print( v[6..] ) 'Schau dir Slices an, gibt einen String zurück der den angegeben von Index 6 bis Ende enthält
Blessed is the mind too small for doubt

Xeres

Moderator

BeitragSa, Nov 26, 2011 2:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder eingebaute String-Methoden:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Local v:String = "vname=Peter"
Local a:String[] = v.Split("=")
Print(a[0])
Print(a[1])

Mit .Find() könntest du dir selbst was passendes bauen. Einfach mal im BRL.Retro Modul schauen wie Left, Right usw. umgesetzt wurden.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

CO2

ehemals "SirMO"

BeitragSa, Nov 26, 2011 3:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Erstmal danke für die Antworten.

Ich habe nun folgenden (ungetesteten) Code programmiert: BlitzMax: [AUSKLAPPEN]
Type char
Field vname:String
Field nname:String
Field sname:String
Field title:String
Field modelfile:String
Field aitype:String
Field id:String
End Type

Function ReadCharDesc(file:String)
Local descfile:TStream
descfile = ReadFile(file)
Local befehl:String
Local newchar:char = New char
Repeat
befehl = ReadLine(descfile)
Local splittet:String[] = befehl.split("=")
If(splittet[0] = "vname")
newchar.vname = splittet[1]
EndIf
If(splittet[0] = "nname")
newchar.nname = splittet[1]
EndIf
If(splittet[0] = "sname")
newchar.sname = splittet[1]
EndIf
If(splittet[0] = "title")
newchar.title = splittet[1]
EndIf
If(splittet[0] = "model")
newchar.modelfile = splittet[1]
EndIf
If(splittet[0] = "aitype")
newchar.aitype = splittet[1]
EndIf
If(splittet[0] = "id")
newchar.id = splittet[1]
EndIf
Until Eof(descfile)
End Function


Ich denke, das war die einfachste lösung für das Problem... Nur habe ich immernoch ein Problem: Wenn z.b. anstatt Code: [AUSKLAPPEN]
vname=Franz
das geschrieben wird: Code: [AUSKLAPPEN]
vname = Franz
wird natürlich der Name " Franz" und nicht "Franz" ausgelesen.
Kann ich irgendwie quasi einen Filter einbauen, das Leerzeichen sowie Tabs nicht mitgelesen werden?

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

grafe

BeitragSa, Nov 26, 2011 3:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Co2,
Ich glaube was du suchst ist der Befehl Trim()
Kleines Beispiel:
BlitzMax: [AUSKLAPPEN]
Print "  Hallo"
Print Trim(" Hallo")

mfg Grafe
SpaceThreat 3D Multiplayer Spaceshooter
 

CO2

ehemals "SirMO"

BeitragSa, Nov 26, 2011 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antwort,


hier noch einmal der fertige Code:
BlitzMax: [AUSKLAPPEN]
Type char
Field vname:String
Field nname:String
Field sname:String
Field title:String
Field modelfile:String
Field aitype:String
Field id:String
End Type

Function ReadCharDesc(file:String)
Local descfile:TStream
descfile = ReadFile(file)
Local befehl:String
Local newchar:char = New char
Repeat
befehl = ReadLine(descfile)
Local splittet:String[] = befehl.split("=")
If(splittet[0] = "vname")
newchar.vname = Trim(splittet[1])
EndIf
If(splittet[0] = "nname")
newchar.nname = Trim(splittet[1])
EndIf
If(splittet[0] = "sname")
newchar.sname = Trim(splittet[1])
EndIf
If(splittet[0] = "title")
newchar.title = Trim(splittet[1])
EndIf
If(splittet[0] = "model")
newchar.modelfile = Trim(splittet[1])
EndIf
If(splittet[0] = "aitype")
newchar.aitype = Trim(splittet[1])
EndIf
If(splittet[0] = "id")
newchar.id = Trim(splittet[1])
EndIf
Until Eof(descfile)
End Function


Ich danke allen, die halfen Very Happy
mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Xeres

Moderator

BeitragSa, Nov 26, 2011 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Statt tausend und ein If würde ich Select...Case benutzen. Wink
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

CO2

ehemals "SirMO"

BeitragSa, Nov 26, 2011 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, ja, natürlich,
also hier der geänderte Code: BlitzMax: [AUSKLAPPEN]
Type char
Field vname:String
Field nname:String
Field sname:String
Field title:String
Field modelfile:String
Field aitype:String
Field id:String
End Type

Function ReadCharDesc(file:String)
Local descfile:TStream
descfile = ReadFile(file)
Local befehl:String
Local newchar:char = New char
Repeat
befehl = ReadLine(descfile)
Local splittet:String[] = befehl.split("=")
Select(Trim(splittet[0])
Case "vname"
newchar.vname = Trim(splittet[1])
Case "nname"
newchar.nname = Trim(splittet[1])
Case "sname"
newchar.sname = Trim(splittet[1])
Case "title"
newchar.title = Trim(splittet[1])
Case "model"
newchar.modelfile = Trim(splittet[1])
Case "aitype"
newchar.aitype = Trim(splittet[1])
Case "id"
newchar.id = Trim(splittet[1])
EndSelect
Until Eof(descfile)
End Function


mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

PhillipK

BeitragSo, Nov 27, 2011 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ganze lässt sich aber auch noch ein wenig anders schreiben.

Ich persönlich halte nicht sooo viel von hardcode, wie hier. (Dh pro datei individuelle werte auslesen.)

Falls du das ganze auch woanders einsetzen willst, musst du jedesmal den abfragenbaum anpassen.
Hier mal ein ansatz, wie es auch zu lösen ist (natürlich nur vom gedanken her, umsetzen musst du es =D)

1) Datei einlesen. While Not EOF(stream) -> jede zeile auf "=" durchsuchen und alles in eine TMap eintragen (CreateMap() ! - aufbau der zeile ist dann typischerweise zb key = value oder auch key=value, wenn du Trim benutzt!)
2) kleine abfragefunktionen schreiben - zb GetString(key, default) -> key ist hier zb vname oder nname - default ist zb "".
3) Die rückgabe sollte aus der TMap kommen - value ist bsp "Peter" und key ist "vname". Ist nichts verfügbar, gibts den Default wert zurück (um evtl weitere verarbeitung vorzunehmen oder andere standartwerte zu setzen)
-> anmerkung: TMap ist case sensetiv, dh du solltest eventuell mit Lower(string) das ganze zb erst auf kleinbuchstaben bringen (beim eintragaen und auslesen!)

Wenn du das ganze noch sinnvoll als type oder ähnliches abpackst, hast du ein miniframework, mit dem du eben solch formatierte dateien auslesen kannst.

Bedenke aber, das ist nur ein kleiner, persönlicher einwurf um hardcode vorzubeugen. Smile

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group