Datenverarbeitung Array, LL, Pointer, Structuren
Datenverarbeitung Array, LL, Pointer, Structuren
Hallo Zusammen,
leider fällt mir kein passender Titel ein. Hoffe, es ist so O.K.
In den letzten Tage habe ich mir hier die Tuts über Array, LL, Pointer, Structuren
durchgelesen und bin jetzt total verwirrt. Mir fehlt ein Ansatz, wie ich folgendes
bewerkstelligen kann.
Also ich habe zwei Datenbanken, in diesen Datenbanken sind ca. 40 Tabellen,
in diesen 40 Tabellen sind mehrere 100.000 Datensätze.
Ich komme nicht über folgendes Problem hinweg:
Was nutze ich jetzt am besten zwei Arrays, LL um alle Tabellen und die darin
enthaltenen Datensätze einzulesen und weiterzuverarbeiten bzw.
damit ich diese beiden Datenbanken vergleichen kann.
Ist es ratsam pro Datenbank erst alle Tabellen mit den Datensätzen einzulesen
um die unterschiede festzustellen und auszugeben, oder
die identischen Tabellen in beiden Datenbanken einzulesen, zu vergleichen,...
Ausserdem müsste ich dann, wenn Unterschiede oder neue Datensätze
vorhanden sind diese protokollieren, sowie die Spaltennamen und evtl.
Zeilen wissen.
Wäre super, wenn mir jemand einen Anstoss geben könnte, wie ich am
besten ansetze.
Hatte auch gedacht, ich würde eine Structur anlegen und dann, aber...
Hm, hoffe es kann mir jemand dabei helfen. Wäre toll.
Viele Grüße
leider fällt mir kein passender Titel ein. Hoffe, es ist so O.K.
In den letzten Tage habe ich mir hier die Tuts über Array, LL, Pointer, Structuren
durchgelesen und bin jetzt total verwirrt. Mir fehlt ein Ansatz, wie ich folgendes
bewerkstelligen kann.
Also ich habe zwei Datenbanken, in diesen Datenbanken sind ca. 40 Tabellen,
in diesen 40 Tabellen sind mehrere 100.000 Datensätze.
Ich komme nicht über folgendes Problem hinweg:
Was nutze ich jetzt am besten zwei Arrays, LL um alle Tabellen und die darin
enthaltenen Datensätze einzulesen und weiterzuverarbeiten bzw.
damit ich diese beiden Datenbanken vergleichen kann.
Ist es ratsam pro Datenbank erst alle Tabellen mit den Datensätzen einzulesen
um die unterschiede festzustellen und auszugeben, oder
die identischen Tabellen in beiden Datenbanken einzulesen, zu vergleichen,...
Ausserdem müsste ich dann, wenn Unterschiede oder neue Datensätze
vorhanden sind diese protokollieren, sowie die Spaltennamen und evtl.
Zeilen wissen.
Wäre super, wenn mir jemand einen Anstoss geben könnte, wie ich am
besten ansetze.
Hatte auch gedacht, ich würde eine Structur anlegen und dann, aber...
Hm, hoffe es kann mir jemand dabei helfen. Wäre toll.
Viele Grüße
hmm .. kommt ein wenig auf das DBMS an.
Wenn Du auf beide Datenbanken per ODBC o.ä. Zugriff hast, kannst Du Dir
das vorherige Auslesen sparen. Macht kaum Sinn bei einigermassen anständigen DBMS.
Ansonsten würd ich mir ne lokale Kopie der Tabellen (ich denk da an Sqlite)
anlegen mögen um dann dort den Vergleich auch im DB-Kontext zu tätigen.
Ansonsten bleibt Dir vermutlich nur das zeilenweise Auslesen relevanter
Daten aus Tabelle1 der DB1 mit zeilenweisem Vergleich von Daten der
Tabelle2 aus DB2.
Strukturen zum Datenvergleich sind schonmal nicht so ganz daneben.
Ist nett ordentlich und gut handlebar.
Ich würd allerdings erstmal anfangen mit der Bildung und dem
Vergleich von MD5Fingerprints der relevanten Daten und erst bei
Abweichung genauer "nachgucken" wollen.
Wenn Du auf beide Datenbanken per ODBC o.ä. Zugriff hast, kannst Du Dir
das vorherige Auslesen sparen. Macht kaum Sinn bei einigermassen anständigen DBMS.
Ansonsten würd ich mir ne lokale Kopie der Tabellen (ich denk da an Sqlite)
anlegen mögen um dann dort den Vergleich auch im DB-Kontext zu tätigen.
Ansonsten bleibt Dir vermutlich nur das zeilenweise Auslesen relevanter
Daten aus Tabelle1 der DB1 mit zeilenweisem Vergleich von Daten der
Tabelle2 aus DB2.
Strukturen zum Datenvergleich sind schonmal nicht so ganz daneben.
Ist nett ordentlich und gut handlebar.
Ich würd allerdings erstmal anfangen mit der Bildung und dem
Vergleich von MD5Fingerprints der relevanten Daten und erst bei
Abweichung genauer "nachgucken" wollen.
pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Ist die Größe der Einträge denn Fix, oder verändert es sich?
Arrays sind fix, wenn du also irgendwann mehr daten als das Maximum eingibst, ist das problematisch.
Dafür sind Linked Lists besser.
Sind die 40 Tabellen vom Aufbau her gleich, oder unterscheiden sie sich?
Theorethisch machst du eine Struktur pro Tabelle
Dann machst du daraus 40 Linked List
und fügst eben pro Datensatz ein Element einer Linked list hinzu.
Du kannst auch verschachtelte Strukturen machen, sodaß du 2 Strukturen hast (die beiden zu vergleichenden Datenbanken)
und fügst erstmal 40 Elemente der Linked list dazu
In diese 40 Elemente, die ja ihrerseits eine STruktur sind, fügst du dann die Datensätze ein.
Dann gehst du z.B. mit einer For-Next schleife alle Listen und deren Einträge durch und guckst ob die EInträge mit den entsprechenden Einträgen der zweiten Datenbank übereinstimmen.
Aber bei mehreren 100000 Datensätzen ..hm..
ich würd da ja eher was über die Database-Befehle von PB machen.
Also über SQL oder Accessdatenbanken oder sowas.
Da werden die Zeitpunkte der Änderungen etc nänlich auf wunsch gleich mitprotokolliert und du kannst nach Datum abfragen
Und dann eben mit PB nur das Einlesen / Vergleichen der Daten basteln.
Macht imho mehr sinn, als selber das ganze Datenbanksystem neu zu programmieren.
Arrays sind fix, wenn du also irgendwann mehr daten als das Maximum eingibst, ist das problematisch.
Dafür sind Linked Lists besser.
Sind die 40 Tabellen vom Aufbau her gleich, oder unterscheiden sie sich?
Theorethisch machst du eine Struktur pro Tabelle
Dann machst du daraus 40 Linked List
und fügst eben pro Datensatz ein Element einer Linked list hinzu.
Du kannst auch verschachtelte Strukturen machen, sodaß du 2 Strukturen hast (die beiden zu vergleichenden Datenbanken)
und fügst erstmal 40 Elemente der Linked list dazu
In diese 40 Elemente, die ja ihrerseits eine STruktur sind, fügst du dann die Datensätze ein.
Dann gehst du z.B. mit einer For-Next schleife alle Listen und deren Einträge durch und guckst ob die EInträge mit den entsprechenden Einträgen der zweiten Datenbank übereinstimmen.
Aber bei mehreren 100000 Datensätzen ..hm..
ich würd da ja eher was über die Database-Befehle von PB machen.
Also über SQL oder Accessdatenbanken oder sowas.
Da werden die Zeitpunkte der Änderungen etc nänlich auf wunsch gleich mitprotokolliert und du kannst nach Datum abfragen
Und dann eben mit PB nur das Einlesen / Vergleichen der Daten basteln.
Macht imho mehr sinn, als selber das ganze Datenbanksystem neu zu programmieren.
2D Game H.E.R.A. (Entwicklung eingefroren)
www.chamaeleo-fx.de.vu
- mein Lieblingszitat
"die Informationsumwelt wird von einer fürchterlichen Menge an Unsinn und Lügen verschmutzt" (Stanislaw Lem, Lokaltermin, 1954 (!) )
http://www.stanislaw-lem.de/zitate/zitate.shtml
www.chamaeleo-fx.de.vu
- mein Lieblingszitat
"die Informationsumwelt wird von einer fürchterlichen Menge an Unsinn und Lügen verschmutzt" (Stanislaw Lem, Lokaltermin, 1954 (!) )
http://www.stanislaw-lem.de/zitate/zitate.shtml
Hallo Zusammen,
hallo bobobo
danke für Deine Antwort,
ja ich hatte es so gedacht, dass ich aus den Tabellen jeden Datensatz(Zeile)
auslese, hieraus einen StringHash ermittle und dann die eine Tabelle mit der
anderen Tabelle vergleiche ob dieser StringHash vorhanden ist.
Meintest du es auch so?
Aber irgendwie weis ich nicht wie ich eine Structur anlegen soll. Naja, anders
ausgedrückt, in der Hilfe steht wie ich es machen muss, dass ist nicht das
Problem, aber das aussehen der Structur.
Also evtl. so, oder bin ich da auf dem falschen Dampfer?
Kann man eigentlich mehrere Structuren anlegen also auch für Datenbank_2?
Nur, ich verstehe noch nicht, es sind ja mehrere Tabellenspalten und
mehrere Tabellenzeilen.
Irgendwie komm ich nicht da über den Berg.
Vielleicht könntest Du / Ihr mir da noch mal helfen.
Vielen Dank und viele Grüße
hallo bobobo
danke für Deine Antwort,
ja ich hatte es so gedacht, dass ich aus den Tabellen jeden Datensatz(Zeile)
auslese, hieraus einen StringHash ermittle und dann die eine Tabelle mit der
anderen Tabelle vergleiche ob dieser StringHash vorhanden ist.
Meintest du es auch so?
Aber irgendwie weis ich nicht wie ich eine Structur anlegen soll. Naja, anders
ausgedrückt, in der Hilfe steht wie ich es machen muss, dass ist nicht das
Problem, aber das aussehen der Structur.
Also evtl. so, oder bin ich da auf dem falschen Dampfer?
Code: Alles auswählen
Structure Datenbank_1
sTabellenname.s
lTabellenspalte.l
lTabellenzeile.l
sInhaltstring.s
EndStructure
Global *Datenbank_1List
Nur, ich verstehe noch nicht, es sind ja mehrere Tabellenspalten und
mehrere Tabellenzeilen.
Irgendwie komm ich nicht da über den Berg.
Vielleicht könntest Du / Ihr mir da noch mal helfen.
Vielen Dank und viele Grüße
Hallo Zusammen,
hallo SirCus,
also die 40 Tabellen sind vom Aufbau nicht gleich.
Z. B wird in einer Tabelle Lieferanten gespeichert,
dann in einer weiteren Kunden und so weiter.
Aber der Aufbau der Datenbanken ist identisch.
Also ich lese die Tabellennamen aus;Kann ich die
Structur den während des Codeablaufs verändern?
Also ich denke das ich alle Daten aller Tabellen auslesen
muss und dann die gleichen Tabellen aus DB1 und DB2
vergleichen muss.
Ich hatte schon den Ansatz, da ich nicht die ganze Zeile
pro Tabelle komplett auslesen kann, sondern nur spaltenweise
einen String anzulegen, hieraus einen Stringhash zu machen und
dann diesen Stringhash mit der anderen Tabelle zu vergleichen.
Hoffe da konnte überhaupt noch jemand folgen.
Schon mal vielen Dank für eure Geduld und Mühe
Viele Grüße
hallo SirCus,
also die 40 Tabellen sind vom Aufbau nicht gleich.
Z. B wird in einer Tabelle Lieferanten gespeichert,
dann in einer weiteren Kunden und so weiter.
Aber der Aufbau der Datenbanken ist identisch.
Also ich lese die Tabellennamen aus;Kann ich die
Structur den während des Codeablaufs verändern?
Also ich denke das ich alle Daten aller Tabellen auslesen
muss und dann die gleichen Tabellen aus DB1 und DB2
vergleichen muss.
Ich hatte schon den Ansatz, da ich nicht die ganze Zeile
pro Tabelle komplett auslesen kann, sondern nur spaltenweise
einen String anzulegen, hieraus einen Stringhash zu machen und
dann diesen Stringhash mit der anderen Tabelle zu vergleichen.
Hoffe da konnte überhaupt noch jemand folgen.
Schon mal vielen Dank für eure Geduld und Mühe
Viele Grüße
Mein StringHash wäre der MD5Fingerprint .. jonexus72 hat geschrieben: Meintest du es auch so?
-----
Also Struktur
Eine Struktur ist eigentlich nix anderes als hintereinandergelegte
Variablen (bzw. eigentlich wohl eher die Zieladressen der Speicherbereiche
der hintereinandergelegten Variablen)
Ist nichts arg kompliziertes wenn man das irgendwie im Kopf behält.
Du kannst Strukturen sackweise anlegen .. pb ist das Wurst solange der
Arbeitsspeicher ausreicht.
und dann LinkedListen .. und die auch noch strukturiert
Ein schönes Beispiel liefert der Quellcode der SQLITE3_Include
Ergebnisse der Abfragen liegen sort nett in strukturierten Listen rum
----------
guck mal nächststehenden Code an
Code: Alles auswählen
;Definitionen Struktur ... beliebige Variablennamen
Structure Inhalt
id.l
MD5Hash.s
color.s
EndStructure
; Definitionen Variablen
ZeileTabelle1DB1.Inhalt
ZeileTabelle2DB2.Inhalt
;Zuweisungen
ZeileTabelle1DB1\id=507
ZeileTabelle1DB1\MD5Hash="hansdietrichgenscher"
ZeileTabelle1DB1\color="gelb"
ZeileTabelle2DB2\id=309
ZeileTabelle2DB2\MD5Hash="ludgervollmer"
ZeileTabelle2DB2\color="grün"
;Vergleich
If ZeileTabelle1DB1\MD5Hash<>ZeileTabelle2DB2\MD5Hash
o.s="das ergibt "+ZeileTabelle1DB1\color+ZeileTabelle2DB2\color
o.s+#CRLF$
o.s+"Diff "+Str(ZeileTabelle1DB1\id)+" "+Str(ZeileTabelle2DB2\id)
MessageRequester("AuaHa",o,0)
Else
MessageRequester("soso","gleicher Hash",0)
EndIf
pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Hallo Bobobo,
vielen Dank für Deine schnelle Antwort.
Das Beispiel habe ich verstanden. Super vielen Dank.
Hätte jedoch noch so ein zwei Fragen.
Ich habe Deine Code etwas anders gestaltet,
geht das so auch?
Ausserdem könntest du mir bitte erläutern, wie
ich jetzt alle Zeilen in diese Structur hineinkriege?
Also das Zeilen auslesen ist nicht das Problem,
sondern wie kriege ich es gespeichert.
Weiterhin, wie kann ich den Dim DB1.Inhalt(100)
automatisch anpassen, kenne ja nicht die Zeilenanzahl
Kann ich das so machen um Zeile für Zeile hier einzulesen?
Z.B.:
Ich hoffe ich nerve nicht zu sehr wenn ich noch folgende
Frage hätte, wie ich hierzu Pointer einsetzen muss..
Schon mal vielen Dank für Deine / Eure Geduld und Mühe.
Viele Grüße
vielen Dank für Deine schnelle Antwort.
Das Beispiel habe ich verstanden. Super vielen Dank.
Hätte jedoch noch so ein zwei Fragen.
Ich habe Deine Code etwas anders gestaltet,
geht das so auch?
Ausserdem könntest du mir bitte erläutern, wie
ich jetzt alle Zeilen in diese Structur hineinkriege?
Also das Zeilen auslesen ist nicht das Problem,
sondern wie kriege ich es gespeichert.
Weiterhin, wie kann ich den Dim DB1.Inhalt(100)
automatisch anpassen, kenne ja nicht die Zeilenanzahl
Kann ich das so machen um Zeile für Zeile hier einzulesen?
Z.B.:
Code: Alles auswählen
i = 0
For i = i to (Zeilenanzahl - 1)
DB2(i)\id = 0 ;für Zeile 1 aus der Tabelle der Datenbank_2 ??
next i
;usw???
Frage hätte, wie ich hierzu Pointer einsetzen muss..
Code: Alles auswählen
;Definitionen Struktur ... beliebige Variablennamen
Structure Inhalt
id.l
MD5Hash.s
color.s
EndStructure
Dim DB2.Inhalt(100)
DB2(0)\id = 309
DB2(0)\MD5Hash = "ludgervollmer"
DB2(0)\color = "grün"
Dim DB1.Inhalt(100)
DB1(0)\id = 507
DB1(0)\MD5Hash = "hansdietrichgenscher"
DB1(0)\color = "gelb"
; Definitionen Variablen
; ZeileTabelle1DB1.Inhalt
; ZeileTabelle2DB2.Inhalt
;
; ;Zuweisungen
; ZeileTabelle1DB1\id=507
; ZeileTabelle1DB1\MD5Hash="hansdietrichgenscher"
; ZeileTabelle1DB1\color="gelb"
;
; ZeileTabelle2DB2\id=309
; ZeileTabelle2DB2\MD5Hash="ludgervollmer"
; ZeileTabelle2DB2\color="grün"
;Vergleich
Debug db2(0)\id
If DB2(0)\id <>DB1(0)\id
Debug "AuaHa"
Else
Debug "gleicher Hash"
EndIf
; If ZeileTabelle1DB1\MD5Hash<>ZeileTabelle2DB2\MD5Hash
; o.s="das ergibt "+ZeileTabelle1DB1\color+ZeileTabelle2DB2\color
; o.s+#CRLF$
; o.s+"Diff "+Str(ZeileTabelle1DB1\id)+" "+Str(ZeileTabelle2DB2\id)
; MessageRequester("AuaHa",o,0)
; Else
; MessageRequester("soso","gleicher Hash",0)
; EndIf
Schon mal vielen Dank für Deine / Eure Geduld und Mühe.
Viele Grüße
wieso dim wenn es dynamische linkedlists gibt???
gugge mal
was willst Du mit Pointern?
gugge mal
Code: Alles auswählen
;Definitionen Struktur ... beliebige Variablennamen
Procedure.s makecolor() ;Hilfsprozedur um ein paar Farben zu verteilen
c=Random(3)
Select c
Case 0
o.s="rot"
Case 1
o.s="grün"
Case 2
o.s="schwarz"
Case 3
o.s="gelb"
EndSelect
ProcedureReturn o.s
EndProcedure
Procedure.s makename();Hilfsprozedur um eine Partei mit diesen leblosen Politikgestalten zu füllen
n=Random(4)
Select n
Case 0
o.s="Hans"
Case 1
o.s="Fritz"
Case 2
o.s="Klaus"
Case 3
o.s="Friedrich"
Case 4
o.s="Gerhard"
EndSelect
ProcedureReturn o.s
EndProcedure
Structure Inhalt
id.l
MD5Hash.s
color.s
EndStructure
NewList DB1.Inhalt()
NewList DB2.inhalt()
;Listen füllen
For i=1 To 15 ; jede Liste bekommt 15 Teilnehmer .. je mehr desto dauer
AddElement(DB1())
DB1()\id=i
DB1()\MD5Hash=makename()
DB1()\color=makecolor()
AddElement(DB2())
DB2()\id=i
DB2()\MD5Hash=makename()
DB2()\color=makecolor()
Next i
Enumeration
#win
#Out
EndEnumeration
If OpenWindow(#win,0,0,800,600,"soso",#PB_Window_SystemMenu)
If CreateGadgetList(WindowID(#win))
ListViewGadget(#out,0,0,800,600)
ForEach DB1()
ForEach DB2()
If DB1()\MD5Hash=DB2()\MD5Hash And DB1()\color<>DB2()\color
o.s="Der "+Str(DB1()\id)+". "+DB1()\MD5Hash+" aus DB1 weicht farblich vom "+Str(DB2()\id)+". "+DB2()\MD5Hash+" aus DB2 ab und ist eher "+DB1()\color+" als "+DB2()\color
;Debug o
AddGadgetItem(#out,0,o)
EndIf
Next
Next
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
EndIf
pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Hallo bobobo,
vielen Dank für Deine Antwort und dein Beispiel.
Vielen Dank.
Jetzt werd ich mich mal ranmachen und es mit Echt-Daten zu füllen.
Nochmals vielen Dank für Deine / Eure Hilfe.
Viele Grüße
vielen Dank für Deine Antwort und dein Beispiel.
Hm, da fehlte mir das Wissen. Hab das nicht gewußt.wieso dim wenn es dynamische linkedlists gibt???
Vielen Dank.
Jetzt werd ich mich mal ranmachen und es mit Echt-Daten zu füllen.
Nochmals vielen Dank für Deine / Eure Hilfe.
Viele Grüße