Thread 2 Dateien vergleichen aber....
(14 answers)
Opened by FDX at 2013-08-13 16:47
Erstmal eine allgemeine Empfehlung:
open benutzt man besser in der Form mit drei Argumenten und mit lexikalischen Filehandles: Code (perl): (dl
)
1 2 3 4 5 open(my $fhtwo, "<",$in_file2) or die $!; while (my $line2 = <$fhtwo>) { ...; } close $fhtwo; Dann ein paar speziellere Tipps: 1. Es besteht keine Notwendigkeit, den File1 komplett einzulesen, bevor Du irgendent was machst. Lese erstmal File2 ein, um das Hash zu füllen. Danach kannst Du File1 zeilenweise einlesen und gleich das Ergebnis in den Ausgabefile schreiben. Wenn Du große Files hast, spart das enorm Speicher. 2. Du willst zunächst nur nach dem ersten Wort der jeweiligen Zeile suchen. Dann solltest Du das auch als Key für Deinen Hash verwenden. Beim Füllen also z.B. Code (perl): (dl
)
1 2 3 4 while (my $line2 = <$fhtwo>) { my ($key,@attributes) = split $line2; $hash{$key} = [@attributes]; } Die auf das erste Wort folgenden Eigenschaften sind nun in einem anonymen Array als Value zum Hash-key gespeichert. Beim Lesen von File1 dann Code (perl): (dl
)
1 2 3 4 5 6 7 8 while (my $line1 = <$fhone>) { my ($key,@attributes1) = split $line1; my $attrib_ref2 = $hash{key}; # Hash um Attribute die in File2 vorkamen aus der Attribut-Liste in File1 rauszufiltern my %filter_attrib = map {$_ => 1;} @$attrib_ref2; # Zeile mit Key, Attribute aus File2, gefilterte Attribute aus File1 ausgeben print $fhout join(' ',$key,@$attrib_ref2,grep {!$filter_attrib{$_}} @attributes1)."\n"; } Wenn die Attribute aus File2 nicht in exakt der gleichen Reihenfolge kommen müssen, sondern nur vor denen aus File1 kann man den Code noch etwas vereinfachen, indem man sie gleich in einem anonymen Hash statt einem anonymen Array speichert. Nicht berücksichtigt wurden bislang Fälle, in denen ein Wort zwar in File1 aber nicht in File2 vorkommt oder in dem zwar das Wort vorkommt, aber ohne Attribute. |