Suche Lösung für Datenbank

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Smitty

Betreff: Suche Lösung für Datenbank

BeitragSo, Apr 10, 2005 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Ich habe eigentlich erst wenige Tage Blitz Basic Erfahrung und komme gerade bei meinem Game nicht weiter. Das Forum habe ich durchsucht, aber nicht wirklich etwas gefunden was mir weiter hilft.


Hier mein Problem:

1. Frage:
Ich habe eine Textdatei, die wie eine Datenbank aufgebaut ist.

Bsp.:
1|Mustermann|rot|100|200;
2|Musterfrau|blau|300|400;
3|Müller|gelb|200|200;
...
...


Die Trennzeichen sind mir egal. Die Datei hat etwa 15-20 Spalten.

Wie schaffe ich es nun einen einzelnen Datensatz über den Index zu suchen und auszulesen?



Bei den Lösungen die ich bisher gefunden habe, wurde immer die gesammte Datei ausgelesen. Da meine Datei aber einige tausend Datensätze hat, würde das, schätze ich mal, sehr den Arbeitsspeicher belasten (oder doch nicht?).


Gibt es eine Möglichkeit eine Zeile zu suchen und auszulesen?

Hier noch zwei nebensächliche Fragen.
2. Frage:
Kann man diese Zeile dann verändern und speichern?

3. Frage:
Kann man neue Datensätze ans Ende der Datei hängen?


Das wichtige dabei ist, das die Daten trotzdem weiterhin mit dem normalen Windows-Editor Bearbeitbar und Lesbar bleiben müssen und das es die Spielgeschwindigkeit nicht sehr beeinträchtigt, da es wie gesagt, viele tausend Datensätze sind.


Für Codebeispiele wäre dankbar.

Hubsi

BeitragSo, Apr 10, 2005 23:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist nicht ganz einfach, aber durchaus möglich. Was dazu brauchen wirst sind FileSeek(), SeekFile(), Types, Mid$() sowie die normalen Dateibefehle. Ist wie gesagt nicht das einfachste, aber machbar Smile
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

IonPainter

BeitragSo, Apr 10, 2005 23:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde die Datei zu Anfang in eine Type Liste einlesen und dann da komfortabel durchsuchen und bei Programmende wieder speichern. Oder brauchst du zur Laufzeit Notepad Zugriff?

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSo, Apr 10, 2005 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/view...p;start=20

Hier gibt die meisten Antworten auf deine Fragen hoffe ich mal!

Zitat:
Gibt es eine Möglichkeit eine Zeile zu suchen und auszulesen?

Sind die Datensätze immer gleich lang dann geht mit seekfile Index*Datenlänge ganz gut !
wenn nicht dann bleibt dir nicht vielanderes über als alle Zeile durchzurattetern bis du an die richtige zeile kommst!
Zitat:
Kann man diese Zeile dann verändern und speichern?

ja geht auf jeden Fall sehr einfach wenn es die gleiche länge hat!
Ansonsten alle nachfolgenden auslesen und wieder anhängen!

Zitat:
Kann man neue Datensätze ans Ende der Datei hängen?

das ist das einfachste
BlitzBasic: [AUSKLAPPEN]
Dat = OpenFile (Datei$)
SeekFile FileSize (Datei)
WriteLine dat, Textzeile$
CloseFile dat

das wars schon!
[BB2D | BB3D | BB+]

Firstdeathmaker

BeitragMo, Apr 11, 2005 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde an deiner Stelle, wie IonPainter schon geschrieben hat, die ganze Datei in Types einlesen und im Programm bearbeiten. Meine Erfahrung hat gezeigt dass das einfacher und schneller geht als wenn du ständig an der Datei rumfummelst (War auch meine Idee am Anfang, hat sich aber nicht bewährt).
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

Smitty

BeitragMo, Apr 11, 2005 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ich würde die Datei zu Anfang in eine Type Liste einlesen und dann da komfortabel durchsuchen und bei Programmende wieder speichern.

Ja, wie das geht, hab ich schon gefunden und könnte ich auch umsetzen. Ich weis nur nicht ob das auch so gut ist.
Das muss doch extrem auf den Arbeitsspeicher gehen.
Wenn du viele tausend Datensätze in den Types hat.

Irgendwo in einem Tutorial zu Types steht auch, das diese für eine hohe Anzahl von Datensätze nicht geeignet sind und das Spiel enorm verlangsamen.


Aber wenn das so läuft wäre das natürlich toll und einfach. Hat einer Erfahrung mit mit größeren Types?

Zitat:

Sind die Datensätze immer gleich lang dann geht mit seekfile Index*Datenlänge ganz gut !

In jeder Spalte stehen die selben Datentypen, Texte sind aber unterschiedlich lang, wie es nun gespeichert wird weis ich nicht. Bin wie gesagt Anfänger.
 

René Meyer

BeitragMo, Apr 11, 2005 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn die Zahl der Datensätze bekannt ist, dürfte ein Dim-Feld besser geeignet sein. Einfacher zum Auslesen ist es, wenn jeder Wert in einer Zeile abgelegt wird, dann mußt Du nicht mühsam die Werte zwischen den Trennzeichen auswerten.

Arbeitsspeicher-Probleme sollte es nicht geben. Überleg mal - eine Zeile 80 mit Zeichen sind bei 10.000 Zeilen gerade 800.000 Byte, also weniger als ein Megabyte. Die meisten Vollpreisspiele brauchen 256 Megabyte und mehr.
www.blitzbasic.de | Das Buch zu Blitz Basic: www.schreibfabrik.de/txt/bbb

D2006

Administrator

BeitragMo, Apr 11, 2005 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest für Texte von vornherein eine Zeichenanzahl vorgeben.
Zum Beispiel bei Vornamen 20 Zeichen. Ist der Vorname zu lang, wird er abgeschnitten (wird ja wohl selten der Fall sein). Ist er zu kurz, wird er mit Leerzeichen aufgefüllt.

Dadurch weißt du ja dann genau die exakte Größe einer Zeile.

MfG
D2006
 

Smitty

BeitragDi, Apr 12, 2005 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
@René Meyer
Stand halt im Tutorial, das Types dafür nicht geeignet sind.
Aber an der Größe kann man das glaube nicht so ausmachen.

Ich denke nämlich das,
1 Speicherstelle mit 100 Byte schneller vom Rechner zu verwalten ist, als 10 Speicherstellen mit 10 Byte(und dann alle Werte mal 1000, für mein Beispiel). Daher kann man das wohl nicht so einfach an der Größe insgesamt ausmachen.


Ich bedanke mich für eure Tipps, ich werde es einfach mal testen und mich dann wieder melden.

Firstdeathmaker

BeitragDi, Apr 12, 2005 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, Fakt ist, dass wenn du eine Liste mit sehr vielen Types bei jedem Programmdurchlauf durchgehst das natürlich sehr lange dauert. Aber bei einer Datenbank geht es ja nicht um den dauernden Zugriff sondern um Suchen von Einträgen oder verschieben oder hinzufügen. Das würde jedoch immer nur in einem einzelnen Durchlauf resultieren, wobei es also nicht mehr so wichtig wäre ob es jetzt z.B. 5000 Einträge sind, weil sie nicht jeden Durchgang aufgerufen werden müssen.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Ctuchik

BeitragDi, Apr 12, 2005 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn du häufig auf die verschiedenen Zeilen zugreifen musst, aber nicht alles in einen Array oder Types einlesen willst, dann würd ich das so machen, dass du lediglich die Positionen der einzelnen Datensätze einliest und speicherst.

Also etwa so (nicht sicher ob das funktioniert, ist jetzt nur so aus dem Kopf):

BlitzBasic: [AUSKLAPPEN]

Dim Pos(5000)

db = ReadFile(\"datenbank.txt\")
id = 1 ;Erste Id in der Datenbank, wenn du mit 0 anfängst nutzt du den Array voll aus
While Not Eof(db)
ReadLine db
Pos(id) = FilePos(db)
id = id + 1
Wend
CloseFile(db)


und kannst dann auf einzelne Datensätze zugreifen:

BlitzBasic: [AUSKLAPPEN]

db = ReadFile(\"datenbank.txt\")
SeekFile Pos(id) ;id = Id die du auslesen willst
daten$ = ReadLine(db)
CloseFile(db) ;Braucht nicht jedesmal geschlossen und wieder geöffnet werden, einmal öffnen reicht


Bin mir nur nicht sicher, ob das mit ReadLine so funktioniert, ggf. einfach mal testen!

MfG Ctuchik
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDi, Apr 12, 2005 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
das lesen wird sicher funktionieren!
Überschreiben nur wenn es gleich lange Strings sind, da sonst alle nachfolgenden Datensätze nicht mehr lesbar sind!
Anhängen geht immer!

Noch eine Frage , um wieviele Daten handelt es sich überhaupt, bzw wie groß ist die Datei ... 50MB?
[BB2D | BB3D | BB+]
 

Smitty

BeitragMi, Apr 13, 2005 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Datensatz/Zeile kann schon auf die 300 Bytes kommen.

Die Anzahl kann viele tausend betragen, bzw. kann vom Spieler beliebig vergrößert werden.

Ist halt ein Managerspiel und hat von der reinen Spielidee sehr großes Potenzial. Eine mögliche spätere Fancommunity könnte die Datensätze sicher auf weit über 10k bringen.

Aber aufgrund der hier vorgeschlagenen Lösungswege, bin ich recht optimistisch was die Umsetzung angeht.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group