dbfpy(dBase)-wie lösche ich Inhalte einer Tabelle?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

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
satart
User
Beiträge: 8
Registriert: Mittwoch 17. Dezember 2008, 21:15

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.
BlackJack

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
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
User
Beiträge: 8
Registriert: Mittwoch 17. Dezember 2008, 21:15

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

:D
BlackJack

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… :roll:
satart
User
Beiträge: 8
Registriert: Mittwoch 17. Dezember 2008, 21:15

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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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

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)
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
BlackJack

@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.
Antworten