PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : doppelte Datensätze finden



apokalypse
14-07-2005, 11:24
hallo,

mein Problem ist folgendes. Ich habe z.b. 2 Dateien die zum Teil gleiche Datensätze enthalten. Nun möchte ich diese doppelten Daten finden. Eine Möglichkeit währe sicherlich den ersten Datensatz von einer Datei auszulesen und dann mit diesem alle Datensätze der zweiten Datei zu durchlaufen, um zu schauen wo es eine Übereinstimmung gibt. Dies wird dann halt auch mit dem zweiten, dritten,.... Datensatz der ersten Datei gemacht. Allerdings ist das nicht gerade effektiv wenn man 100.000 Datensätze hat -> es dauert einfach zu lange. Daher würde ich mich freuen, wenn ihr einige Ideen/Vorschlage dazu hättet.

michael.sprick
14-07-2005, 11:44
sind die Datensätze in den Dateien irgendwie sortiert?
Dann könntest Du z.B. eine Binärsuche anwenden...

apokalypse
14-07-2005, 12:15
hmm ... daran hab ich auch schon gedacht nur leider sind die Daten nicht sortiert und wenn man sie sortieren würde währe mit Sicherheit der Geschwindigkeitsvorteil dahin :(

Badsteve
17-07-2005, 12:42
ka, wie effektiv das ist, aber man könnt das mal mit perl versuchen. Und dann die eine Datei in einen hash einlesen.

baumgartner
17-07-2005, 20:13
wenn dein ram gross genug ist für datei, könntest du die datei in einen array kopieren.

gruß baumi

Badsteve
17-07-2005, 20:31
wenn dein ram gross genug ist für datei, könntest du die datei in einen array kopieren.

gruß baumi

imho ist in einen hash, die schnellere variante, da du nicht für jedes Element das gesamte array durchtesten musst.

steve

apokalypse
17-07-2005, 21:22
das mit dem hash hört sich ja recht interessant an, nur hab ich davon wenig ahnung. es währe also schön wenn mir jemand nen code beispiel oder ne seite nennen kann wo dies ausführlich erklärt wird, besonders auch das problem mit der kollision, die in meinem fall 100%ig vermieden werden muss.

achja ich programmieren nicht in perl

Badsteve
17-07-2005, 21:28
kollision? ich kann dir sonst morgen mal nen bisschen code zur verfügung stellen.

steve

apokalypse
17-07-2005, 21:38
zur kollision: soweit ich weiß sind hash-werte nicht eindeutig, deshalb kann es sein das 2 einträge den selben hash-wert haben oder nicht ?


über bissle code würde ich mich freuen

Badsteve
17-07-2005, 21:42
das ist mit hash nicht gemeint. Ein hash ist eine Datenstruktur in Perl.

steve

apokalypse
17-07-2005, 21:56
hm also ich verstehe unter hash eine datenstruktur bei der die daten in einer tabelle gespeichert werden. soweit ich weiß wird dabei der schlüssel in einen hash wert umgerechnet der als index dient und die genaue position des elements darstellt.

kann sein das perl so etwas integriert hat, aber wie ich schon sagte ich benutze kein perl :rolleyes:

michael.sprick
18-07-2005, 07:16
Richtig, in Perl versteht man unter einem Hash eine tabellenartige Datenstruktur - assoziatives Array wäre eine andere Bezeichnung.
Ein Hash besteht aus KEY->VALUE Paaren wobei ein Key einmalig ist. demnach gibt es auch keine Kollisionen, wenn Du die Datensätze als Key benutzt.
Allerdings habe ich so meine Zweifel, ob das bei >100.000 Datensätzen wirklich "effektiv" ist.

Du kannst es ja mal probieren:
(setzt voraus, das ein "Datensatz" immer in einer Zeile steht)



#!/usr/bin/perl

use warnings;
use strict;

my @Dateien = ('datei1.txt' , 'datei2.txt'); # Dateien die eingelesen werden sollen
my %Hash;

foreach(@Dateien)
{
my $Datei = $_;
if(-e $Datei)
{
print "Lese Datei \"$Datei\" ein...\n";
open(FH,"<$Datei");
while(FH)
{
chomp;
$Hash{$_} = 1;
}
close(FH);
}
else
{
print "Datei kann nicht geoeffnet werden\n";
}
}

foreach(keys(%Hash))
{
print "$_\n";
}



Das Skript liest dann alle Dateien, die in @Dateien stehen ein und schreibt die Zeilen als Key in ein Hash.
Am Ende werden alle Keys aus dem Hash ausgegeben...

Die Ausgabe kannst du dann ja in eine Datei umleiten:



# perl skript.pl > ausgabe.txt

Badsteve
18-07-2005, 12:02
#!/usr/bin/perl

use warnings;
use strict;

my ($file1, $file2) = @ARGV;
my %hash;
open(FH,$file1) or die "Fehler beim ˆffnen";

foreach(<FH>) {
# F¸r jede Zeile wird ein Hash-Element mit dem "Namen"
# als Schl¸ssel erstellt
$hash{$_}++;
}
close(FH);

open(FH,$file2) or die "Fehler beim ÷ffnen";

foreach(<FH>) {
# Das Element wid ausgegeben, falls das Hash-Element schon existiert
# Dann ist das Element dopppelt vorhanden.
print $_ if $hash{$_};
}


hier werden nur die gleichen elemente ausgeben.


steve

apokalypse
18-07-2005, 23:21
danke :)

konnte dadurch die zeit von 1h auf 1min verringern