Abgleichen von Dateien

D

DocJunioR

Grünschnabel
Hallo

Ich habe das Problem, dass ich eine Textdatei mit einer Oracle-DB abgleichen muß.

Das Ganze läuft so, dass ich mir die Daten aus der Oracle-DB in eine Datei spoole, mit Trennzeichen "::".
Die Textdatei auf dem Rechner hat das Gleiche Trennzeichen, jedoch einen anderen Aufbau.

Nun muß ich schauen, ob die Dateneinträge aus der Oracle-DB anders aussehen als die Einträge in der Textdatei. Anschließend muß ich die entsprechenden Datensätze aus Oracle entfernen, ändern oder hinzufügen.

Kann mir da wer nen Tipp oder noch besser nen Codeschnipsel geben, mit dem ich das Ganze lösen kann?
 
$ diff datei1 datei2

Das zeigt Dir die Unterschiede zwischen den 2 Dateien.
 
Gummibear schrieb:
$ diff datei1 datei2

Das zeigt Dir die Unterschiede zwischen den 2 Dateien.
Der Vorschlag mit diff wird scheitern, wenn die Struktur der Dateien nicht gleich ist.
Wenn ich das richtig verstehe, soll nach Abschluß der Aktion genau das in der Datenbank stehen, was im Text-File 1 steht. Das ist dann der Fall, wenn die Daten die dort nicht vorkommen auch aus der DB raus sollen.
Wenn dem so ist, könntest du einfach die Datensätze in die entsprechende Reihenfolge bringen und dann die gesamte DB/Tabelle löschen und die Datei einfügen.
Ich kenne die Oracle-DB Syntax nicht, aber da wirst du sicher selbst die Insert Statments kennen.
Umsortieren der Felder in deiner DB kannst du relativ einfach via AWK wobei der FS hier eben :: ist. Alternativ kannst du das alles auch in ein perlscript packen, was gleich alles erledigt.
Schritt hier Textdatei einlesen , via split mit :: als Trennzeichen, die Felder umsortieren wie benötigt, und dann mit dem DBI Modul die Datensätze die nicht gleich sind einfügen.
Das ist alles sehr generisch, aber umfasst die Vorgehensweise.
Sind es nur wenige Daten, ist es wohl performanter die gesamte umsortierte Datei einzuspielen.
Ist die Datenmenge größer, so lassen sich auch beide Dateien nach der Umformatierung der ersten direkt vergleichen, Fallabhängig die Statements erzeugen.
Dabei spielt es natürlich noch eine Rolle, ob du mit der richtigen Reihenfolge oder entsprechenden Indexierung als key arbeitest.
Aber wie gesagt, mit Oracle kenn ich mich garnicht aus. Für sql oder mysql ist das aber mit perl ein sehr schnell zu erstellendes wrapper-script.
Hoffe etwas geholfen zu haben.
Gruß Wolfgang
 
Hmm.. also an Perl hab ich ehrlich gesagt noch garnicht gedacht.
Eigentlich nur, weil ich es nicht sonderlich mag. (seeehr kryptisch)
Auf der anderen Seite bin ich eben Programmierer und muß tun, was ein Programmierer tun muß.
Ich denke, dass das ständige Löschen von Daten hier leider nicht geduldet wird, obwohl es sich tatsächlich nur um ein oder 2 dutzend Einträge handelt..

Wie dem auch sei, werd mich dan mal auf die Suche nach meinem PERL-Buch begeben..
 
Naja du musst ja nicht perl dafür verwenden, das ist nur ein Vorschlag von mir gewesen.
Ich kenne mich halt mit perl am besten aus, so dass ich die Vorteile im Einsatz von perl sowohl in der shell als auch im web als auch bei der Bereitstellung der Schnittstellen zu Datenbanke etc zu schätzen weiss.
Das unterscheidet perl ja grundsätzlich von z.B. php
Wenn deine Datensätze ein garantiert festes Format haben, kannst du die Umsortierung natürlich leicht auch mit awk oder sed erledigen.
z.B. Machen folgende Einzeiler das Gleiche.

echo "A::B::C::D"|awk -F"::" '{print $3"::"$2"::"$1"::"$4}'
C::B::A::D
echo "A::B::C::D"|perl -a -F"::" -ne 'print "$F[2]::$F[1]::$F[0]::$F[3]"'
C::B::A::D

Das geht mit perl sogar noch kürzer, aber ich wollte es nicht kryptischer machen als es ist
:D
Dann musst du die Dateien eventuell sortieren und dann könntest du natürlich auch diff darauf loslassen und oder in einer Schleife Datensatz für Datensatz einlesen und abhängig von dem Vergleich gleich deinen INSERT|UPDATE|DELETE String zusammenbauen.
Zum Schluss dann natürlich noch die Datenbankschnittstelle entsprechend füttern.
Da dachte ich eben an perl, da du dort alles schön in einem script vereinen kannst, und es genügend Module gibt um die Sache zu vereinfachen.

Gruß Wolfgang
 

Ähnliche Themen

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

SquidGuard - urls-Eintraege werden z.T. nicht gefiltert

[PHP] Tabellen dynamisch aktualisieren/nachladen mittels AJAX

Mittels Shell Script Datei zurecht schneiden

csv-Datei mit UNIX zurecht stutzen und Daten in xls-Datei laufend abspeichern

Zurück
Oben