Daten speichern, lesen und vergleichen

Anfängerfragen zum Programmieren mit PureBasic.
AddMe
Beiträge: 46
Registriert: 04.05.2009 23:24

Daten speichern, lesen und vergleichen

Beitrag von AddMe »

Hallo,

ich bin neu hier und habe mir PureBasic gekauft.
Benutze die Version 4.3, habe Windows XP Prof.

Nun habe ich leider eine Frage:

Wie kann ich eine Liste in eine Datei speichern, die sich
ständig erweitert. Am liebsten wäre mir eine txt datei.

Die Daten die ich speichern muss sehen so aus:

123456,654321,987654,456789, usw.

Diese Daten muss ich anschließend mit einer anderen
Liste vergleichen.

Die Frage ist wie kann ich diese Daten aus der Datei
lesen und ergänzen und wieder speichern?

Wäre toll, wenn mir hierzu jemand ein Beispiel zeigen könnte.
Habe mal unter Preference geschaut, aber, das scheint nicht
das richgitge zu sein.


Vielen Dank schon mal für Eure Hilfe.

Viele Grüße
Michael
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

CreateFile, ReadFile usw.
Das einfachste ist es die Datei zu lesen und dann mit den angehängten Daten
neu zu schreiben. Ansonsten kannst Du aber auch mit

Code: Alles auswählen

FileSeek(1, Lof(1))
ans ende springen.
Teste das erstmal aus und dann sehen wir weiter :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

Code: Alles auswählen

; ------------------------------------------------------------
;   PureBasic - File example file
;    (c) 2001 - Fantaisie Software
; ------------------------------------------------------------


MessageRequester("PureBasic", "Welcome !"+Chr(13)+"PureBasic will write a file named: PureBasicTestFile.pb", 0)

If CreateFile(0, "PureBasicTestFile.txt")
  WriteStringN(0, "         This is a PureBasic file test")
  WriteString(0, "Now it's on ")
  WriteString(0, "the same line.")

  CloseFile(0)
Else
  MessageRequester("PureBasic", "Error: can't write the file", 0)
  End
EndIf

If ReadFile(0, "PureBasicTestFile.txt")

  First$ =  Trim(ReadString(0))
  MessageRequester("PureBasic", "Line read: "+First$, 0)
  
  CloseFile(0)
Else
  MessageRequester("PureBasic", "Error: Can't read the file", 0)
EndIf

End
Steht alles in der PB-Hilfe unter File System ferner Loc / Lof / FileSeek um ans Ende der Liste zu kommen, kompliziert wird's wenn Datensätze nur einmal vorkommen dürfen...

[EDIT]
Böses ts-soft, war schneller und schreibt verwirrende Sachen :mrgreen:

Code: Alles auswählen

FileSeek(1, Lof(1))
funktioniert natürlich nur wenn man beim "öffnen" des Files auch 1 für den ersten Parameter verwendet hat, für mein Bsp müsste es also

Code: Alles auswählen

FileSeek(0, Lof(0))
sein deshalb immer schön Konstanten benutzen...
Zuletzt geändert von D@nte am 04.05.2009 23:51, insgesamt 2-mal geändert.
AddMe
Beiträge: 46
Registriert: 04.05.2009 23:24

Beitrag von AddMe »

Hallo,
ts-soft hat geschrieben:Teste das erstmal aus und dann sehen wir weiter :wink:
Vielen Dank werde es mal testen.

Gruß
Michael
AddMe
Beiträge: 46
Registriert: 04.05.2009 23:24

Beitrag von AddMe »

Hallo D@nte,

vielen Dank für das Beispiel, werde es mir mal jetzt ansehen und
sehen wie weit ich komme. :)

Tja, die Daten dürfen wirklich nur einmal vorkommen. :cry:

Gruß
Michael
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

AddMe hat geschrieben:Tja, die Daten dürfen wirklich nur einmal vorkommen. :cry:
evtl. würde es sich lohnen, hierfür eine Datenbank (beispielsweise SQLite)
einzusetzen.

Grüße ... Kiffi
a²+b²=mc²
AddMe
Beiträge: 46
Registriert: 04.05.2009 23:24

Beitrag von AddMe »

Hallo Kiffi,
Kiffi hat geschrieben:
AddMe hat geschrieben:Tja, die Daten dürfen wirklich nur einmal vorkommen. :cry:
evtl. würde es sich lohnen, hierfür eine Datenbank (beispielsweise SQLite)
einzusetzen.

Vielen Dank für den Hinweis.
Hört sich sehr interessant an.
Habe in der Hilfe "Database" und "UseSQLiteDatabase()" gefunden.

Hm, also müsste ich eine Datenbank anlegen, eine Tabelle und dort bräuchte ich ja nur eine Spalte. Tja, so wie ich das schreibe hört sich das einfach an. ;-) Jedoch wenn man anfängt...

Weis nur nicht, wie ich dann, wenn neue Nr hinzukommen, überprüfe ob sie doppelt sind, und wenn nicht einfüge,...

Ist den die Anzahl der zu speichernden Nr begrenzt ?

Vielen Dank schon mal für Deine Hilfe und Geduld.

Gruß
Michael
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

AddMe hat geschrieben:Weis nur nicht, wie ich dann, wenn neue Nr hinzukommen, überprüfe ob sie doppelt sind, und wenn nicht einfüge,...
mach das Feld einfach UNIQUE. Dann wird das Einfügen doppelter Einträge
einfach verhindert.

Code: Alles auswählen

CREATE TABLE DeineTabelle (DeinFeld UNIQUE)
AddMe hat geschrieben:Ist den die Anzahl der zu speichernden Nr begrenzt ?
nicht wirklich. Ich glaube gelesen zu haben, dass die max. Größe bei zwei
Terabyte liegt. Die max. Größe der RowID liegt bei 9223372036854775807.

siehe auch: http://www.sqlite.org/limits.html

Grüße ... Kiffi
a²+b²=mc²
AddMe
Beiträge: 46
Registriert: 04.05.2009 23:24

Beitrag von AddMe »

Hallo Kiffi,
Kiffi hat geschrieben: mach das Feld einfach UNIQUE. Dann wird das Einfügen doppelter Einträge einfach verhindert.

Code: Alles auswählen

CREATE TABLE DeineTabelle (DeinFeld UNIQUE)
Also, wenn ich mit

Code: Alles auswählen

DatabaseUpdate(0, "INSERT INTO FallNr (Nr) VALUES (123456)")

oder ist dieser Befehl richtig?

DatabaseQuery(0, "INSERT INTO FallNr (Nr) VALUES (123456)")



einfügen wollte, dann würde er eine Fehlermeldung auswerfen,
die ich dann abfangen könnte?
Kiffi hat geschrieben: Die max. Größe der RowID liegt bei 9223372036854775807.
Also, ich denke das sollte reichen. :lol:

Schon mal vielen Dank für Deine Tipps.

Gruß
Michael
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Hallo Michael,

Code: Alles auswählen

DatabaseUpdate(0, "INSERT INTO FallNr (Nr) VALUES (123456)")

... ist die richtige Wahl. Immer, wenn Du ein Insert, Update oder Delete
ausführst, dann verwendest Du DatabaseUpdate(). Bei einem Select nimmst
Du DatabaseQuery().
AddMe hat geschrieben:dann würde er eine Fehlermeldung auswerfen,
die ich dann abfangen könnte?
DatabaseUpdate liefert einen Rückgabewert, den Du hier dann ignorieren
kannst. Du brauchst also nicht aktiv irgendwas abfangen.

hier ein kleiner Test-Code mit einer memory-Datenbank, der Dir zeigt,
was passiert, wenn man 2mal den gleichen Wert einfügen will. Der erste
RetVal ist 1 und DatabaseError() gibt nichts aus. Beim zweiten Aufruf ist
RetVal 0 und DatabaseError() gibt "column Nr is not unique" aus.

Code: Alles auswählen

UseSQLiteDatabase()

DB = OpenDatabase(#PB_Any, ":memory:", "", "", #PB_Database_SQLite)

If DB
  
  DatabaseUpdate(DB, "Create Table FallNr (Nr UNIQUE)")
  
  RetVal = DatabaseUpdate(DB, "Insert Into FallNr (Nr) Values (12345)")
  Debug RetVal
  Debug DatabaseError()
  
  RetVal = DatabaseUpdate(DB, "Insert Into FallNr (Nr) Values (12345)")
  Debug RetVal
  Debug DatabaseError()

  CloseDatabase(DB)
  
EndIf
Noch ein Tipp: Beim Einfügen grosser Datenmengen solltest Du eine
Transaktion verwenden. Das beschleunigt das Verfahren enorm:

Code: Alles auswählen

DatabaseUpdate(DB, "Begin Transaction") 
For Counter = 1 To ...
 DatabaseUpdate(DB, "Insert Into ...
Next Counter
DatabaseUpdate(DB, "Commit")


Grüße ... Kiffi
a²+b²=mc²
Antworten