Daten speichern, lesen und vergleichen
Daten speichern, lesen und vergleichen
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
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
- 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
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 ans ende springen.
Teste das erstmal aus und dann sehen wir weiter
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))
Teste das erstmal aus und dann sehen wir weiter

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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
[EDIT]
Böses ts-soft, war schneller und schreibt verwirrende Sachen

Code: Alles auswählen
FileSeek(1, Lof(1))
Code: Alles auswählen
FileSeek(0, Lof(0))
Zuletzt geändert von D@nte am 04.05.2009 23:51, insgesamt 2-mal geändert.
Hallo Kiffi,
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
evtl. würde es sich lohnen, hierfür eine Datenbank (beispielsweise SQLite)Kiffi hat geschrieben:AddMe hat geschrieben:Tja, die Daten dürfen wirklich nur einmal vorkommen.![]()
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.

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
mach das Feld einfach UNIQUE. Dann wird das Einfügen doppelter EinträgeAddMe hat geschrieben:Weis nur nicht, wie ich dann, wenn neue Nr hinzukommen, überprüfe ob sie doppelt sind, und wenn nicht einfüge,...
einfach verhindert.
Code: Alles auswählen
CREATE TABLE DeineTabelle (DeinFeld UNIQUE)
nicht wirklich. Ich glaube gelesen zu haben, dass die max. Größe bei zweiAddMe hat geschrieben:Ist den die Anzahl der zu speichernden Nr begrenzt ?
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²
Hallo Kiffi,
Also, wenn ich mit
einfügen wollte, dann würde er eine Fehlermeldung auswerfen,
die ich dann abfangen könnte?
Schon mal vielen Dank für Deine Tipps.
Gruß
Michael
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)
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?
Also, ich denke das sollte reichen.Kiffi hat geschrieben: Die max. Größe der RowID liegt bei 9223372036854775807.

Schon mal vielen Dank für Deine Tipps.
Gruß
Michael
Hallo Michael,
... ist die richtige Wahl. Immer, wenn Du ein Insert, Update oder Delete
ausführst, dann verwendest Du DatabaseUpdate(). Bei einem Select nimmst
Du DatabaseQuery().
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.
Noch ein Tipp: Beim Einfügen grosser Datenmengen solltest Du eine
Transaktion verwenden. Das beschleunigt das Verfahren enorm:
Grüße ... Kiffi
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().
DatabaseUpdate liefert einen Rückgabewert, den Du hier dann ignorierenAddMe hat geschrieben:dann würde er eine Fehlermeldung auswerfen,
die ich dann abfangen könnte?
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
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²