Thread 2 Dateien vergleichen aber.... (14 answers)
Opened by FDX at 2013-08-13 16:47

clms
 2013-08-13 19:27
#169543 #169543
User since
2010-08-29
373 Artikel
BenutzerIn
[default_avatar]
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.

View full thread 2 Dateien vergleichen aber....