Sonntag, August 06, 2006

Ich suche ein Perl-Skript mit dem ich zwei Text-Dateien voneinander subtrahieren kann. Der Inhalt der Dateien ist ähnlich im Sinnes davon, dass die Zeilen gleich formatiert sind. Kann ich die Dateien evtl. auch mit diff subtrahieren?

Da ich in kurzer Zeit nichts passendes finden konnte habe ich ein eigenes Skript subtractOptimized.pl geschrieben:
open(FILE0, $ARGV[0]);
@lines0 = <FILE0>;
@lines0 = sort @lines0;
open(FILE1, $ARGV[1]);
@lines1 = <FILE1>;
@lines1 = sort @lines1;
for (@lines0) {
  $left = $_;
  $left =~ s/\r|\n//g;
  &find();
}
close(FILE0);
close(FILE1);


sub find() {
  my $remove = 0;
  my $retry = 0;
  if (scalar @lines1 > 0) {
    $right = $lines1[0];
    $right =~ s/\r|\n//g;
    if ($left lt $right) {
      print $left."\n";
    }
    if ($left eq $right) {
      $remove = 1;
    }
    if ($left gt $right) {
      $remove = 1;
      $retry = 1;
    }
    if ($remove > 0) {
      shift @lines1;
    }
    if ($retry > 0) {
      &find();
    }
  } else {
    print $left."\n";
  }
}

Das Skript subtrahiert Datei2 von Datei1, mit der Randbedingung, dass die Dateien sortiert werden. Diese Randbedingung ist für meine Zwecke ok und verbessert die Laufzeit. Wen die Randbedingung (Sortierung) stört, der darf selbst noch Hand anlegen.