perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 21
Click for quality!




11.02.2012 / 20:00

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragVergleich von 2 Tab Txt Files anhand von 3 Werten
Seitenanfang
Hallo,

folgende Sache - ich lese mit DBI 2 Datenbanken aus - habe also folglich 2 txt Files auf der Platte. Jetzt will ich diese 2 Files in eines Packen - jedoch nur jene Zeilen, wo bestimmte (3) Spalten in beiden Files gleich sind.

Wie bekomme ich sowas am schnellsten hin?

Habe schon ein wenig mit Filehandlern und verschachtelten While Schleifen experimentiert - ohne Erfolg.

Vielen Dank für die Unterstützung.

Datum: 27.07.2006-11:29

Beitragre: Vergleich von 2 Tab Txt Files anhand von 3 Werten
Seitenanfang
Geht zwar sicherlich auch eleganter, sollte aber funktionieren (ist nicht getestet wg. Ende von Mittagspause...):

#!c:\perl\bin\perl

use strict;

my (@datei1,@datei2);

open(IN,"<file1.txt");
@datei1 = <IN>;
close IN;

open(IN,"<file2.txt");
@datei2 = <IN>;
close IN;

open(OUT,">ergebnis.txt");

foreach my $string1 ( @datei1 ){

# statt ; must du das entsprechende Trennzeichen verwenden
my @array1 = split( ";", $string1 );
my $anzahl = $#array1;
my $count = 0;

foreach my $string2 ( @datei2 ){

# statt ; must du das entsprechende Trennzeichen verwenden
my @array2 = split( ";", $string2 );
for( my $a = 0; $a <= $anzahl; $a++ ){
$count ++ if( $array1[$a] eq $array2[$a] );
}
}
print OUT $string1 if( $count >= 3 );
}

close OUT;

Datum: 27.07.2006-12:58

Beitragre: Vergleich von 2 Tab Txt Files anhand von 3 Werten
Seitenanfang
mh, danke für den Ansatz - es fehlt mir aber die möglcihkeiten mehrere felder abzufragen und dann die gesamte Zeile mit werten der zeile aus file 1 und 2 zu schreiben

:)

Datum: 27.07.2006-13:33

Beitragre: Vergleich von 2 Tab Txt Files anhand von 3 Werten
Seitenanfang
an sich gehts jetzt,

zu beachten ist auch, das ein File 3500 Zeilen hat , das andere 140000....

Somit dauert das agnze eine halbe ewigkeit - gib es nicht vorgefertigte Module für sowas????

Datum: 27.07.2006-14:11

Beitragre: Vergleich von 2 Tab Txt Files anhand von 3 Werten
Seitenanfang
Hallo,

grundsätzlich wirst du nichtdrumrum kommen, jede Zeile der einen Datai mit der kompletten anderen Datei zu vergleichen.
Also 3500 x 140.000 = 490.000.000 Vergleiche.
Herzlichen Glückwunsch !
Auch ein fertiges Modul muss nicht weniger vergleiche machen.
Aber man kann hier trotzdem optimieren.
Entweder - wie ich in schon geschrieben hatte - lass es direkt die Datenbank machen. Die haben schon hoch optimierte Routinen für sowas.
Oder benutze Hashes, damit zumindest die Vergleiche schnell gehen.
Vorschlag: Lese Datei 1 ein und extrahiere die drei Felder die dich interessieren. Dann fügst Du diezu einem String zusammen, mit einem Trennzeichen, das nicht in den Strings vorkomt.
Das haust Du in ein Hash und verhinderst damit auch, dass doppelte darin vorkommen.
Mit Datei 2 machst Du das selbe.
Dann durch Hash1 loopen und schauen, ob der Wert auch in Hash 2 vorkommt.
Ergibt - durch ausfilterung der doppelten - evt. weniger Vergleiche, die - dank Hash - schneller gehen als immer durch die Datei 2 zu loopen.

Code kann ich Dir nicht liefern, da ich das erst selber probieren müsste - bin auch nicht so fit in Perl.

spline

Datum: 28.07.2006-12:28

Beitragre: Vergleich von 2 Tab Txt Files anhand von 3 Werten
Seitenanfang
Servus,

mal bloede gefragt: Kannst Du nicht gleich bei den DB-Abfragen den Vergleich machen?
... WHERE db1.x = db2.x AND db1.y = db2.y ....

spline

Datum: 28.07.2006-09:08

-






-
-