Design / Konzept oder Anfängerfrage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

Ich bin wirklich am verzweifeln langsam:

Ich möchte CSV-ähnliche Dateien bearbeiten.
Diese sollten Funktionen haben wie
select_columns, welche eine neue CSV-ähnliche Datei erschafft, in der nur die angegebenen Spalten sind.

Es sollen Hintereinanderausführungen von Befehlen möglich sein wie

Code: Alles auswählen

datei.select_columns("bla").select_rows(bedingung), 
Zwischenergebnisse wollte ich in tempfile.TemporaryFile() speichern.

Bisher hab ich gedacht ich mache das so (Pseudocode):

Code: Alles auswählen

class handler:
    file               # an einen handler wird eine datei gebunden, die dieser dann bearbeiten kann
    select_columns(spaltennamen)
        neuer_handler = handler()
        file = open(file)
        for line in file:
            mach was hübsches und schreibe in temporäre datei
        neuer_handler.file = file
    write(pfad)
        file = open(pfad)
        kopiere den Inhalt self.file  in file und erzeuge damit wieder ein nicht-temporäres Objekt   
Das Problem, das ich hierbei sehe, ist dass ich unterscheiden muss ob file nun eine temporäre datei war oder nicht, da ein open() Aufruf sonst Unsinn wäre.
Um das ganze nur im Speicher zu bearbeiten und am Ende wieder in eine Datei zu schreiben, sind die Datenmengen eigentlich zu groß.

Was wäre ein geeigneter Ansatz das ganze zu lösen?

(Im Moment fallen mir Typüberprüfungen ein)
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

Wäre eventuell eine abgeleitete Klasse temporary_pmd_handler angebracht?
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

ich verstehe nicht ganz was CSV ähnlich heissen soll? Was heisst das konkret.
So wie ich den Text verstehe willst du SQL ähnliche Operationen auf diese 'Tabelle' ausführen, oder? Falls dies so ist so würde ich es evtl. so machen, dass du deine Datei einliest, in eine Datenbank schreibst (im Speicher) und dann kannst du ohne Probleme deine Operationen durchführen. Zum Schluss das ganze wieder als ein CSV ähnliches Format exportieren.
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

Das ganze ist ein selbstgeschriebenes Format.
Es existieren eine Menge Skripten, einige von denen sind sehr SQL-lastig also wirklich so etwas wie select from where...
andere hingegen haben ganz andere Zwecke.

Das ganze Format lässt sich nicht exakt beschreiben, aber der Hauptteil ist eigentlich nur eine Tabelle.

Das ganze in eine Datenbank zu schreiben habe ich auch noch vor, aber nur wenn das vom Benutzer gewünscht ist.
Pläne dafür existieren bereits
BlackJack

@ravenheart: Für mich schreien zumindest die beiden Funktionen `select_columns()` und `select_rows()` irgendwie nach Iteratoren. Dann hätte man zumindest bei diesen beiden Operationen auch das Problem mit dem Speicher nicht wirklich.
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

Kannst du erläutern, wie genau du dir das vorstellst?

An welcher Stelle sollte hier ein Iterator hin?
Immerhin wird über eine Datei ja schon iteriert, also zeilenweise eingelesen und verarbeitet.
BlackJack

@ravenheart: Funktion die so eine Datei einliest → Iterator der die einzelnen Datensätze liefert.

Funktion zum Selektieren der Spalten, die einen Datensatz-Iterator bekommt → Iterator der Datensätze mit den gewünschten Spalten liefert.

Funktion zum Selektieren der Datensätze → Iterator der die selektierten Datensätze liefert.

Funktion zum Schreiben so einer Datei, die einen Iterator mit Datensätzen bekommt.

Und schon braucht man keine kompletten Tabellen als Zwischenergebnisse mehr.
Antworten