Problem beim Auslesen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

ben33

Betreff: Problem beim Auslesen

BeitragDi, Aug 25, 2009 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich möchte eine Textdatei auslesen, in denen Werte stehen.
Die Datei ist so Aufgebaut (ist für nen FUssballmanager den ich später machen möchte):
Textdatei (team1_kader.txt)

Beyern München

Ransing
TW
8

Batt
TW
8

Luhm
LV
9

Ich habe mir paar Tutorials angeschaut...Habe das gemacht was da steht, aber hat nicht funktioniert.
Leider kann ich euch den Code gerade nicht sagen da ich an nem anderen PC bin.
Hoffe auf Hilfe
Aktuelles Projekt:
Abpfiff 2009
Stand: 1%

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Aug 25, 2009 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Suche mal hier im Forum nach einem ''INI Reader Writer''. Dieses sollte deinen Ansprüchen am ehesten genügen und wäre auch sehr Fehlersicher, wenn alle Einträge vom Programm gemacht würden.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Nicdel

BeitragDi, Aug 25, 2009 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hectics Lösung ist die beste für so etwas. Du könntest aber auch die Zeilen mit ReadLine einzeln auslesen und dann zuordnen.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

ben33

BeitragDi, Aug 25, 2009 13:01
Antworten mit Zitat
Benutzer-Profile anzeigen
mit dem was ich finde werde ich nicht so richtig schlau...
und wenn ich das richtig lese liest der .ini dateien aus?

ich brauche ja aber für .txt dateien!
Aktuelles Projekt:
Abpfiff 2009
Stand: 1%

Nicdel

BeitragDi, Aug 25, 2009 13:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist doch völlig egal welche Endung die Datei hat! Das mit dem Ini bedeutet nur, dass die einzelnen Eigenschaften ordentlich in Felder aufgeteilt sind, wie bei normalen ini-Dateien eben.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

ben33

BeitragDi, Aug 25, 2009 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
so..also ich verstehe den größten teil des scripts...
aber wie kann ich jetzt eine bestimmte datei auslesen...
hier das script:
BlitzBasic: [AUSKLAPPEN]
Const Ini_Normal=0 
;Dies ist die Grundsektion; in normalen Inis steht hier nichts drin, da dies eigentlich gar keine Sektion ist.
;Const SektionID=<einmalige ID>
;eigene Sektionen kommen hier hin.





Global NextWordTxt$

Function NextWord$(Txt$)
;Diese Funktion gibt das nächste Wort im String zurück.
;NextWordTxt$ beinhaltet den Rest des Strings
;Als Trenner funktionieren
While Replace(Mid(Txt,1,1),Chr(9)," ")=" "
Txt=Mid(Txt,2,Len(Txt)-1)
Wend
Local ZW=Instr(Replace(Txt$,Chr(9)," ")," ")
If ZW=0
NextWordTxt$=""
Return Txt$
Else
NextWordTxt$=Right(Txt$,Len(Txt$)-ZW+1)
Return Left(Txt$,ZW-1)
EndIf
End Function

Function HexToInt(HexS$);Umwandlung eines hexadezimalen Zahlenstrings in einen Integer
Local ZW
Local ZW2
Local Integer
HexS$=Upper(HexS$)
For ZW=1 To Len(HexS$)
Select Mid(HexS$,ZW,1)
Case "0"
Integer=Integer Shl 4
Integer=Integer Or $0
Case "1"
Integer=Integer Shl 4
Integer=Integer Or $1
Case "2"
Integer=Integer Shl 4
Integer=Integer Or $2
Case "3"
Integer=Integer Shl 4
Integer=Integer Or $3
Case "4"
Integer=Integer Shl 4
Integer=Integer Or $4
Case "5"
Integer=Integer Shl 4
Integer=Integer Or $5
Case "6"
Integer=Integer Shl 4
Integer=Integer Or $6
Case "7"
Integer=Integer Shl 4
Integer=Integer Or $7
Case "8"
Integer=Integer Shl 4
Integer=Integer Or $8
Case "9"
Integer=Integer Shl 4
Integer=Integer Or $9
Case "A"
Integer=Integer Shl 4
Integer=Integer Or $A
Case "B"
Integer=Integer Shl 4
Integer=Integer Or $B
Case "C"
Integer=Integer Shl 4
Integer=Integer Or $C
Case "D"
Integer=Integer Shl 4
Integer=Integer Or $D
Case "E"
Integer=Integer Shl 4
Integer=Integer Or $E
Case "F"
Integer=Integer Shl 4
Integer=Integer Or $F
Default
Return Integer
End Select
Next
Return Integer
End Function

Function BinToInt(BinS$);Umwandlung eines binären Zahlenstrings in einen Integer
Local ZW
Local Integer
For ZW=1 To Len(BinS$)
Select Mid(BinS$,ZW,1)
Case "0"
Integer=Integer Shl 1
Integer=Integer Or %0
Case "1"
Integer=Integer Shl 1
Integer=Integer Or %1
Default
Return Integer
End Select
Next
Return Integer
End Function

Function Int2%(val$);Umwandlung eines "Integerstrings" in einen Integer
Select Left(val$,1)
Case "$";Eine hexadezimale Zahl
Return HexToInt(Mid(val$,2,Len(val$)-1))
Case "%";Eine Binärziffer
Return BinToInt(Mid(val$,2,Len(val$)-1))
Default
Return Int(val$)
End Select
End Function



Function Load(FileStream,Strict=0)
;Die eigentliche Ini-Ladefunktion
;Bei Fehlern wird die Zeilennummer zurückgegeben, wenn der Parameter "Strict" "True" ist.
;Sonst wird der Fehler einfach überlesen.
; Nicht eingerückte Kommentarzeilen, wie diese hier, kennzeichnen Teile, bei denen man etwas Eigeninitiative zeigen muss. :-)

Local LineText$,Word$
Local Sektion
Local InBracket;1-"[",2-"="
Local Brackettext$
Local WertI%,WertF#,WertS$

Local LineNr=0
;--------------
; Eigene Variablen
;--------------
Sektion=Ini_Normal
While Eof(FileStream)=0 ;Zeilenweise durcharbeiten
InBracket=0
Brackettext=""
LineText=ReadLine(FileStream)
LineNr=LineNr+1

;Zum vereinfachen des Lesens
;Jeder wichtige "Begriff" wird jetzt durch Leerzeichen von den anderen getrennt.
LineText$=Replace(LineText,"["," [ ")
LineText$=Replace(LineText,"]"," ] ")
LineText$=Replace(LineText,Chr(34)," "+Chr(34)+" ")
LineText$=Replace(LineText,"="," = ")
LineText$=Replace(LineText,";"," ; ")

While Len(LineText)>0
Word$=NextWord(LineText$)
LineText$=NextWordTxt$
Select InBracket
Case 1;[
Select Word$
Case "]" ;neue Sektion
Select Brackettext$
; Case Lower("Sektionsname")
; Sektion=SektionsID
; ;Mache irgendwas weiteres
Default ;Sektion unbekannt?
If Strict
Return LineNr
EndIf
End Select
Exit
Case ";" ;Hier ein Kommentar?
If Strict
Return LineNr
EndIf
Exit
Default
Brackettext$=Lower(Word$) ;Name der neuen Sektion setzen.
End Select
Case 2;=
Select Word$ ;String aus Anführungszeichen extrahieren
Case ";" ;Hier ein Kommentar?
If Strict
Return LineNr
EndIf
Exit
Case Chr(34) ;ein Anführungszeichen->Jetzt wird der Wert ermittelt.
WertI=Instr(LineText,Chr(34))
If WertI<2;kein abschließendes Anführungszeichen?
If Strict
Return LineNr
EndIf
Exit
EndIf
WertS=Mid(LineText,2,WertI-3)
Default
If Strict
Return LineNr
EndIf
Exit
End Select

WertS$=Replace(WertS$," [ ","[");Vereinfachung rückgangig machen
WertS$=Replace(WertS$," ] ","]")
WertS$=Replace(WertS$," = ","=")
WertS$=Replace(WertS$," ; ",";")

WertS$=Replace(WertS$,""",Chr(34)) ;Diese Sonderzeichen schreibt man wie in HTML.
WertS$=Replace(WertS$,"&","&") ;Bei der Speicherfunktion sollte man dies beachten!

;Werte für andere Datentypen vorberechnen
;WertS$ gibt den Wert ohne Änderung an.
;WertI% hat ihn in einen Integer umgewandelt
;WertF# hat ihn in eine Float umgewandelt
WertI%=Int2(WertS$)
WertF#=Float(WertS$)
If WertI<>0 And WertF=0
WertF=WertI ;Floatwerte werden auch bei binären und hexadezimalen Zahlen gesetzt
ElseIf WertI=0 And WertF<>0
WertI=WertF ;bei z.B. ".49" oder 1.e9 bekommt der Integer auch einen Wert
EndIf


Select Sektion ;Sektion?
Case Ini_Normal ;keine Sektion
If Strict
Return LineNr
EndIf
; Case SektionsID
; Select Brackettext$
; Case Lower("Variablenname")
; ;Wertzuweisung
; End Select
Default
If Strict
Return LineNr
EndIf
End Select
InBracket=0
Exit
Default
Select Word$
Case "[" ;Jetzt wird die Sektion gewechselt
InBracket=1
Brackettext$=""
Case "]"
If Strict
Return LineNr
EndIf
Exit
Case "=" ;Wertzuweisung
InBracket=2
Case Chr(34) ;Ein " hier?
If Strict
Return LineNr
EndIf
Exit
Case ";" ;ein Kommentar
Exit
Default ;Die Variable wird geändert
Brackettext$=Lower(Word$)
End Select
End Select
Wend
Wend
End Function
Aktuelles Projekt:
Abpfiff 2009
Stand: 1%

mpmxyz

Betreff: "Load(FileStream)"

BeitragDi, Aug 25, 2009 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
FileStream ist das, was du bei ReadFile/OpenFile zurück bekommst.

Du musst bedenken, dass diese Ini-Dateien so aussehen:
Code: [AUSKLAPPEN]
;Kommentar
[Sektion];Kommentar
Schlüssel="Wert"


Du musst also mindestens hier etwas eigenes schreiben:
BlitzBasic: [AUSKLAPPEN]
Select Brackettext$
Case Lower("Schlüsselname")
Globale1$=WertS$;oder
Globale2%=WertI%;oder
Globale3#=WertF#
End Select


Das kommt dann unter das "Case Ini_Normal ;keine Sektion", wenn du keine Sektionen verwendest.
Du musst natürlich den String "Schlüsselname" anpassen.

Wenn du Sektionen haben möchtest, dann musst den Code von oben unter ein "Case Ini_Sektionsname_hier" in die selbe Select-Konstruktion schreiben, wobei das "Ini_Sektionsname_hier" eine Konstante ist, die für die erste Sektion 1 ist, für die zweite 2 etc.

Für jede Sektion schreibst du hinter diesen Code...
BlitzBasic: [AUSKLAPPEN]
Case 1;[
Select Word$
Case "]" ;neue Sektion
Select Brackettext$

diesen Code...
BlitzBasic: [AUSKLAPPEN]
Case Lower("Sektionsname")
Sektion=Ini_Sektionsname_hier


Du musst dabei natürlich "Sektionsname" und "Ini_Sektionsname_hier" entsprechend ersetzen.

Ich hoffe, dass in meinem Beitrag die Lösung auf deine Frage war. Smile

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group