Ich habe gerade mal in meinem alten DBASE-Buch nachgesehen:
DELETE : Datensatz zum löschen markieren
RECALL : Löschmarkierung wieder aufheben
PACK : Datensatz aus DB löschen
ZAP : Alle Datensätze in der aktiven DB löschen
EDIT: Hilft leider nur direkt in DBASE
Dann wäre der einzige 'sinnvolle' Ansatz nur die gewünschten Daten aus Tabelle A zu selektieren und in Tabelle B zu schreiben.
hth, querdenker
dbfpy(dBase)-wie lösche ich Inhalte einer Tabelle?
-
- User
- Beiträge: 424
- Registriert: Montag 28. Juli 2003, 16:19
- Wohnort: /dev/reality
Wieso mit Java? Da hättest Du mit DBF das gleiche Problem. Das ist keine Einschränkung von Python sondern von DBF. Das ist ein total simples Dateiformat wo einfach nach einem Header der die Datensätze beschreibt, die Datensätze nacheinander in der Datei liegen. Und etwas mitten aus einer Datei zu löschen, ohne mindestens alles nachfolgende "nach vorne" zu kopieren, ist halt bei heutigen Dateisystemen nicht möglich. Da ändert auch die Programmiersprache nichts dran.
Ich habe noch nicht verstanden, warum du überhaupt eine eigene Anwendung dafür brauchst. Mit OpenOffice z.B. kannst du dBase-Dateien problemlos bearbeiten.satart hat geschrieben:Es gefällt mir überhaupt nicht, dass die Datenbank umkorpiert werden muss,
damit die Zeilen auch wirklich physikalisch gelöscht werden.
Ich werde mal mit Java probieren. Vielleicht lässt sich das ganze
eleganter lösen.
also,
ich will openoffice nicht verwenden, weil der zugriff auf dBase automatisiert werden soll.
Das ist ja auch der Grund warum ich dafür ein Programm schreiben muss.
Bei Java sieht nur etwas besser auch. Auch unter Java gibt es kaum dBase Klassen.
Zum Glück habe ich eine Klasse gefunden, das alle meiner Anforderungen enspricht.
http://www.heinerkuecker.de/DbfEdit.html
Besonders wichtig war es für mich dass die gelöschen Daten auch physikalisch gelöscht werden.
Mir fehlt halt die Zeit und Geduld das Rad neuzuerfinden.
Trotzdem habe ich hier sehr viel über dBase lernen können ....
vielen Dank an alle
ich will openoffice nicht verwenden, weil der zugriff auf dBase automatisiert werden soll.
Das ist ja auch der Grund warum ich dafür ein Programm schreiben muss.
Bei Java sieht nur etwas besser auch. Auch unter Java gibt es kaum dBase Klassen.
Zum Glück habe ich eine Klasse gefunden, das alle meiner Anforderungen enspricht.
http://www.heinerkuecker.de/DbfEdit.html
Besonders wichtig war es für mich dass die gelöschen Daten auch physikalisch gelöscht werden.
Mir fehlt halt die Zeit und Geduld das Rad neuzuerfinden.
Trotzdem habe ich hier sehr viel über dBase lernen können ....
vielen Dank an alle
Rad neu erfinden!? Du müsstest nur die `pack()`-Methode in Python implementieren. Also wenn ich zwischen ein paar Zeilen Python-Code schreiben oder Java verwenden müssen, entscheiden müsste…
naja nur ein paar zeilen sind es auch nicht.
Der Zugriff auf dBase ist halt nur ein Teil der Aufgabe.
Da ich noch nie richtig mit Python gearbeitet habe, dachte ich
dass das Projekt eine gute Gelegenheit wäre mich mit Python
zubeschäftigen.... aber das nächste Projekt kommt bestimmt
Ich will jetzt auch keine Diskussion starten über Java versus Python.
In Java bin ich halt zuhause.
Der Zugriff auf dBase ist halt nur ein Teil der Aufgabe.
Da ich noch nie richtig mit Python gearbeitet habe, dachte ich
dass das Projekt eine gute Gelegenheit wäre mich mit Python
zubeschäftigen.... aber das nächste Projekt kommt bestimmt
Ich will jetzt auch keine Diskussion starten über Java versus Python.
In Java bin ich halt zuhause.
Manoman, der Java-Code ist nicht gerade eine Meisterleistung von Heiner. In den 1000 Zeilen, die eine xBase-Datei verarbeiten können, sind gerade mal 40 für das Packen zuständig. Habe mir jetzt nicht die Mühe gemacht, was es da in Python schon gibt, aber der Algorithmus in Java reduziert sich auf
Offenbar kann man mit `go_to_record() einen Cursor zu einem Datensatz bewegen und es wird ein EOF-Status gesetzt. Für einen Record kann man prüfen, ob er gelöscht wurde. Schließlich kann man die Daten lesen und schreiben.
Den anfänglichen Test, ob wohl überhaupt gelöschte Daten vorhanden sind, halte ich für überflüssig.
Den Rest der 1000 Zeilen kann man wahrscheinlich (da sie sehr viel heiße Luft enthalten) in 2-3 Stunden portieren.
Stefan
Code: Alles auswählen
class XBase:
def pack(self):
i = j = 1
self.go_to_record(i)
while not self.eof:
if self.is_deleted():
i += 1
else:
if i != j:
self.go_to_record(i)
buf = self.get_record()
self.go_to_record(j)
self.set_record(buf)
i += 1
j += 1
self.go_to_record(i)
self.set_record_count(j)
Den anfänglichen Test, ob wohl überhaupt gelöschte Daten vorhanden sind, halte ich für überflüssig.
Den Rest der 1000 Zeilen kann man wahrscheinlich (da sie sehr viel heiße Luft enthalten) in 2-3 Stunden portieren.
Stefan
@satart: Mit ein paar Zeilen Quelltext meinte ich das nachrüsten von der `pack()`-Methode bei `dbfpy`. Das sollte nicht viel komplizierter sein, als die Portierung, die sma gezeigt hat. Ist ja bloss eine Schleife die einmal durch die Datensätze geht. Man muss halt schauen was `dbfpy` da an Methoden bietet.