User since
2003-11-12
39
Artikel
BenutzerIn
Hallo,
ich möchte zwei Arrays miteinander vergleichen.
Aufbau Array 1:
1, Wert1
2, Wert2
3, Wert3
=========
1, Wert11
2, Wert12
=========
1, Wert21
2, Wert22
.
.
.
Aufbau Array 2:
1, Wert1
2, Wert2
=========
1, Wert11
2, Wert12
3, Wert13
=========
1, Wert21
2, Wert22
3, Wert23
.
.
.
Diese Werte hab ich aus ner DB ausgelesen.
Es sollen jetzt im ersten Schritt die Primarykeys verglichen werden
hier:
Array1:1, Wert1 mit Array2:1, Wert1 --> stimmt überein, daher wird er nicht weiter verarbeitet
Array1:2, Wert2 mit Array2:2, Wert2 --> stimmt überein, daher wird er nicht weiter verarbeitet
Array1:3, Wert2 mit Array2:3, Wert3 --> uups, im Array 2 gibts keinen Primarykey3 --> dieser DS soll dann ausgegeben werden
========= --> soll ignoriert werden
Array1:1, Wert11 mit Array2:1, Wert11 --> stimmt überein, daher wird er nicht weiter verarbeitet
.
.
.
Array1:3, Wert23 mit Array2:3, Wert23 --> uups, im Array 1 gibts keinen Primarykey3 --> dieser DS soll dann ausgegeben werden
Ausgegeben werden sollen dann die DS, die nicht übereinstimmen!
Wie vergleicht man hier am Besten?
Vielen Dank für die Hilfe!
Schönen Gruss.
User since
2003-08-04
2036
Artikel
BenutzerIn
Hab dir mal schnell etwas zusammen gebastelt...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/perl
use warnings;
use strict;
open(EIN, "<Erste_Tabelle.txt") or die $!; # In dieser Datei stehen deine Daten
my (%pnr1, $cnt);
$cnt = 0;
while(<EIN>) {
chomp;
my @f = split(/,/); # Annahme das du nach , splitten willst...
$pnr1{$f[0].$f[1]} = 1; # merken von deinen Vergleichsfeldern
++$cnt % 1000 or print "Bei Satz $cnt.\n"
} # while
print "Fertig mit $cnt Saetzen.\n";
close(EIN) or die $!;
##############################
open(EIN, "<Zweite_Datei.txt") or die $!; # hier stehen wieder deine Daten
open(AUS, ">Gefunden.txt") or die $!; # und hier die gefundenen
$cnt = 0;
while(<EIN>) {
my @f = split(/,/); # gleich wie oben
my $vergleich = $f[0].$f[1] if $f[0] =~ m/^\d+/; # Vergleichsfeld definieren
# nur wenn 1. Stelle eine Zahl
print AUS $_ if defined $pnr1{$vergleich}; # nur schreibe wenn gleich...
# print AUS $_ if not defined $pnr1{$vergleich}; # nur schreibe wenn nicht gleich...
++$cnt % 1000 or print "Bei Satz $cnt.\n"
} # while
print "Fertig mit $cnt Saetzen.\n";
close(EIN) or die $!;
close(AUS) or die $!;
1;
Gruss\n\n
<!--EDIT|havi|1068647006-->
User since
2003-08-06
2246
Artikel
ModeratorIn
irgendwie schreibst Du etwas verwirrend. Arrays haben keine Primary Keys.
Primary Keys sind mir aus Relationalen Datenbanksystemen bekannt.
Während Deine Schreibweise "
1, Wert1" intuitiv annehmen läßt, Du meinst damit eine Position-im-Array gefolgt von dem Inhalt an der Position, oder aber einen Key/Schlüssel in einem Hash, gefolgt von dessen Value/Wert, gerät der Verständnisansatz an den ========= - Zeilen und der Wiederholung der Ziffer durcheinander.
Mit etwas Mühe kann ich mir noch vorstellen, daß Du jede Zeile als ein Array-Element verstehst. Oha, jetzt ergibt das ganze viel Sinn, vielleicht bin ich einfach zu langsam in der Auffassungsgabe...
Weiter im Text: Deine Array-Inhalte sind also Strings, in denen eine Zahl vom Rest durch die Zeichenfolge ", " (Komma und Leerschritt) zu trennen sind? Die Zahl nennst Du dann Primary Key? Hab ich das so richtig verstanden?
User since
2003-11-12
39
Artikel
BenutzerIn
Sorry, dass es irgendwie verwirrend klingt.
Die Zahl bzw. ich bezeichne ihn als Primary-Key füge ich selbst per Counter ein!
Das ======= füge ich auch ein, wenn eine andere Tabelle abgefragt wird. Da kann man erkennen, wann
eine neue Tabellenabfrage begonnen hat. Das ======= werde ich noch entfernen. Ist zur Zeit nur im Array,
um die Übersichtlichkeit für mich zu erhöhen.
Genau wie du gepostet hast, trennt die Zahl + die Zeichenfolge ", " (Komma und Leerschritt)
den restlichen String.
Ich habe das deshalb so gemacht, weil die beiden Arrays aus 2 verschiedenen DBs ausgelsesen werden
und diese in fast allen Elementen übereinstimmen. Nur diejenigen, die zwar in dem einen Array, nicht
aber in dem anderen Array sind, sollen ausgegeben werden.
Die Reihenfolge der Elemente ist auch gleich, bis halt auf die, die in dem einen oder anderen Array fehlen.
Ist diese Erklärung etwas besser?
User since
2003-08-04
2036
Artikel
BenutzerIn
Dann sollte mein geposteter Code funzen...
Gruss
User since
2003-11-12
39
Artikel
BenutzerIn
Dein geposteter Code bezieht sich auf Dateien.
Aber ich habe nur (?!) Arrays, die zur Laufzeit erzeugt werden.
Oder verstehe ich da was falsch am Code?
Meine Arrays heissen @array1 und @array2.
User since
2003-08-04
2036
Artikel
BenutzerIn
Dann lass doch ganz einfach die Dateien weg ?!
Gruss
User since
2003-11-12
39
Artikel
BenutzerIn
Vielen Vielen Dank!
Ich hab bei deinem Skript die Dateien weggelassen und so noch ein wenig was geändert (while -> foreach), und jetzt werden mir die Unterschiede in den Arrays angezeigt.
Aber eine Frage hätte ich noch:
Was bedeuted das 1; am Ende?
Gruss :D
User since
2003-08-04
2036
Artikel
BenutzerIn
Gibt true zurueck!
Brauchst du eigentlich nur in einem Perl-Modul, aber schaden
tut es im Skript auch nicht :)
Gruss
User since
2003-08-06
2246
Artikel
ModeratorIn
[quote=havi,12.11.2003, 16:00]Gibt true zurueck!
Brauchst du eigentlich nur in einem Perl-Modul, aber schaden
tut es im Skript auch nicht :)[/quote]
Jein, schon richtig, daß es dem Skript an sich nciht weh tut, aber ein Shell-Skript, welches das Perl-Skript aufruft wird annehmen, daß dieses nicht korrekt ausgeführt wurde. Da sind nämlich die Werte (True-binär0, False-binär1) gerade mal vertauscht.
Edit ... daher der Verwirranfälligkeit wegen lieber lassen.\n\n
<!--EDIT|Relais|1068650070-->