| #!/usr/bin/perl -w |
| |
| # htmlcoldiff - Diff two files (specified on the command line) laid out in |
| # columns. Output a copy of the second file with differences from the first |
| # hi-lighted in bold (with HTML tags). This assumes that the first column of |
| # the file is an identifier that keys two rows of the files together. |
| # |
| |
| $Input1 = $ARGV[0]; |
| $Input2 = $ARGV[1]; |
| |
| open(INPUT1, $Input1) or die "Couldn't open '$Input1'!"; |
| open(INPUT2, $Input2) or die "Couldn't open '$Input2'!"; |
| |
| # Read all of the lines of both files into arrays: |
| my @File1 = <INPUT1>; |
| my @File2 = <INPUT2>; |
| |
| # Convert the first file from an array of lines to a hash from the key to the |
| # whole line. |
| |
| foreach $Line (@File1) { |
| my $Key = (split /\s+/, $Line, 2)[0]; |
| $File1Map{$Key} = $Line; |
| #print "Map '$Key' => '$Line'\n"; |
| } |
| |
| # Loop over the second file, outputting it, surrounding field with <B> tags if |
| # they differ from the first file. |
| |
| foreach $Line (@File2) { |
| my @Fields = split /(\s+)/, $Line; # Keep the seperators as well... |
| my $Key = $Fields[0]; |
| my $CompareLine = $File1Map{$Key}; |
| my @FieldsCompare = split /\s+/, $CompareLine; # Do not keep seperators |
| |
| # Loop over all of the Fields, outputting them with an optional tag... |
| my $FieldNo = 0; |
| foreach $Field (@Fields) { |
| if ($Field =~ /\s+/) { # If it's a seperator, just output it |
| print $Field; |
| } else { # If it's not a seperator, diff it... |
| my $Hilight = 0; |
| |
| if (@FieldsCompare > $FieldNo) { |
| my $FieldComp = $FieldsCompare[$FieldNo]; |
| if ($Field =~ /[0-9]+\.[0-9]+/ && $FieldComp =~ /[0-9]+\.[0-9]+/ && |
| $Field != 0) { # Handle floating point numbers special |
| # They are only highlighted if they change by 20% or more... |
| my $Change = $FieldComp/$Field; |
| $Hilight = 1 if ($Change > 1.3333 || $Change < 0.666); |
| |
| } elsif ($Field ne $FieldComp) { |
| $Hilight = 1; |
| } |
| } |
| |
| print "<b>" if $Hilight; |
| print $Field; |
| print "</b>" if $Hilight; |
| $FieldNo++; |
| } |
| } |
| } |