Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
McArden
Anmeldungsdatum: 17.09.2004 Beiträge: 9
|
Verfasst am: 06.03.2005, 02:25 Titel: Löschen von Datansätzen in Datei |
|
|
Hallo zusammen...
Ich arbeite gerade mit Dateien für direkten Zugriff via Type- Buffer. Schreiben und lesen ist kein Thema - aber nun besteht die Notwendigkeit einzelne Datensätze aus dieser Datei zu löschen. Wie bitte das?
'Get' zum lesen, 'Put' zum schreiben - aber was zum Henker zum löschen?
# |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 06.03.2005, 02:44 Titel: |
|
|
Hallo
Einen einfachen Befehl vergleichbar GET oder PUT gibt es fürs Löschen nicht. Du könntest einfach alle Einträge bis auf den zu löschenden in eine neue Datei kopieren.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Paul aka ICC, HV-Freak
Anmeldungsdatum: 11.09.2004 Beiträge: 588 Wohnort: Uelzen
|
Verfasst am: 06.03.2005, 03:56 Titel: |
|
|
Hab ich mir grad mal ausgedacht:
Code: |
Entry = 3 'Zu löschender Eintrag
OPEN Inputfile$ FOR INPUT AS #1
OPEN Tempfile$ FOR OUTPUT AS #2
FOR a = 1 TO Entry - 1
LINE INPUT #1, Record$
PRINT #2, Record$
NEXT a
LINE INPUT #1, Doof$
DO WHILE NOT EOF(1)
LINE INPUT #1, Record$
PRINT #2, Record$
LOOP
CLOSE #2
CLOSE #1
NAME Tempfile$ AS Inputfile$
|
Der Code setzt vorraus dass ein Eintrag immer nur aus einer Zeile besteht, du musst das noch entsprechend an deinen TYPE-Buffer angleichen. _________________
 |
|
Nach oben |
|
 |
Charly2
Anmeldungsdatum: 28.11.2004 Beiträge: 29 Wohnort: Mittelfranken
|
Verfasst am: 06.03.2005, 08:37 Titel: |
|
|
Ich arbeite viel mit Random-Dateien.
Zum Löschen setzte ich einfach alle Felder auf leer bzw. null und schreibe diesen leeren Datensatz mit PUT in die Datei.
Hier entstehen natürlich Lücken, die bei nächster Gelegenheit, wenn ein neuer Datensatz erstellt wird, wieder geschlossen werden. |
|
Nach oben |
|
 |
McArden
Anmeldungsdatum: 17.09.2004 Beiträge: 9
|
Verfasst am: 06.03.2005, 13:54 Titel: |
|
|
Oh, oh,
ich habe es geahnt. Das mit dem umkopieren wollte ich eigentlich vermeiden. Die Datei um die es geht könnte locker 4MB überschreiten. Das heißt dann also 3,9MB umkopieren, weil ein Datensatz raus muß...
- Das leben ist die Hölle -
Erstmal vielen Dank. Wenn jemandem noch was aderes einfällt, wäre ich über einen Tip sehr dankbar.
- MIST -
# |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 06.03.2005, 14:18 Titel: |
|
|
Hallo
Die einzige Möglichkeit ohne Umkopieren die mir einfällt, wäre eine zweite Datei anzulegen in der drinsteht, welche Einträge aus der ersten ungültig sind und diese dann beim Einlesen zu überspringen. Dann lassen sich "gelöschte" Datensätze sogar wieder herstellen. Natürlich wird die Datei so nicht kleiner.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 06.03.2005, 14:33 Titel: |
|
|
Bitte noch nicht aufgeben wegen dem Datei verkürzen - im Reich vom DOS-API (das berühmte CALL INTERRUPT) verbirgen sich wieder einmal einige Goldschätze. Lies sonst einmal diesen Beitrag:
http://groups.google.com/groups?th=230f7e13ef8e5f94
=> Demnach sollte es also möglich sein, eine Datei quasi echt abzuschneiden.
@McArden:
Für Dein Problem eine kleine Anleitung:
1.) Füll die Lücke Deiner Direktzugriffsdatei mit dem letzten Datensatz - alles noch ordinär mit QB möglich.
2.) Nun würde ich die Datei direkt mit CALL INTERRUPT öffnen (Handle-Funktionen von MS-DOS 2.0+), Dateiposition aufs gewünschte Ende setzen und wie auf Ralf Browns Interrupt-Liste beschrieben einen Schreibzugriff von 0 Bytes durchführen, womit DOS/Windows den Rest abschneidet. Anschliessend Datei schliessen.
Das Ganze kam mir wieder in den Sinn, da ich ganz früher einmal in der Dokumentation eines Modula-2-Compilers eine entsprechende Bibliotheksfunktion gesehen hatte, wo im Wesentlichen der Compilerhersteller diesen CALL INTERRUPT darin verpackt hat. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 06.03.2005, 15:09 Titel: Beispielprogramm zum Thema Datei abschneiden |
|
|
Habe noch ein Beispiel zum Thema Datei abschneiden geschrieben:
http://beilagen.dreael.ch/QB/FILECUT.BAS
Am besten einmal ausprobieren => Damit wird Umkopieren definitiv überflüssig. :-) _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Charly2
Anmeldungsdatum: 28.11.2004 Beiträge: 29 Wohnort: Mittelfranken
|
Verfasst am: 06.03.2005, 15:18 Titel: |
|
|
Man kann es auch so machen wie früher bei der Datenbank DBase.
Die gelöschten Datensätze mit einem speziellen Kennzeichen markieren.
Die werden dann bei der Bearbeitung übersprungen.
Irgendwann kann man dann einen Komprimierungslauf machen,
wo die Datensätze ohne die als gelöscht markierten Sätze kopiert
werden. Dadurch wird die Datei wieder verkleinert.
Dadurch muß nicht bei jedem Löschen der Kopiervorgang durchgeführt werden. |
|
Nach oben |
|
 |
|