Schrift
[thread]5900[/thread]

Vergleich 2er Arrays

Leser: 4


<< |< 1 2 3 4 >| >> 39 Einträge, 4 Seiten
Arasiel
 2003-11-12 15:48
#71401 #71401
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
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.
havi
 2003-11-12 15:56
#71402 #71402
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Hab dir mal schnell etwas zusammen gebastelt...

Code: (dl )
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-->
Relais
 2003-11-12 16:00
#71403 #71403
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
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?
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
Arasiel
 2003-11-12 16:17
#71404 #71404
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
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?
havi
 2003-11-12 16:23
#71405 #71405
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Dann sollte mein geposteter Code funzen...

Gruss
Arasiel
 2003-11-12 16:29
#71406 #71406
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
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.
havi
 2003-11-12 16:30
#71407 #71407
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Dann lass doch ganz einfach die Dateien weg ?!

Gruss
Arasiel
 2003-11-12 16:58
#71408 #71408
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
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
havi
 2003-11-12 17:00
#71409 #71409
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Gibt true zurueck!

Brauchst du eigentlich nur in einem Perl-Modul, aber schaden
tut es im Skript auch nicht :)

Gruss
Relais
 2003-11-12 17:12
#71410 #71410
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[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-->
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
<< |< 1 2 3 4 >| >> 39 Einträge, 4 Seiten



View all threads created 2003-11-12 15:48.