File: ssdiff

package info (click to toggle)
libspreadsheet-read-perl 0.80-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 876 kB
  • sloc: perl: 5,470; lisp: 293; makefile: 14; xml: 1
file content (75 lines) | stat: -rwxr-xr-x 1,861 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/pro/bin/perl

use strict;
use warnings;

sub usage {
    my $err = shift and select STDERR;
    print "usage: $0 [--verbose[=1]] file.xls file.xlsx\n";
    exit $err;
    } # usage

use Getopt::Long qw(:config bundling);
my $opt_v = 1;
GetOptions (
    "help|?"		=> sub { usage (0); },
    "v|verbose:2"	=> \$opt_v,
    ) or usage (1);

my $file1 = shift or usage (1);
my $file2 = shift or usage (1);

binmode STDOUT, ":encoding(utf-8)";

use List::Util qw( max );
use Spreadsheet::Read;
my $ss1 = ReadData ($file1) or die "Cannot read $file1: $!\n";
my $ss2 = ReadData ($file2) or die "Cannot read $file2: $!\n";

print "< $file1\t($ss1->[0]{sheets} sheets)\n";
print "> $file2\t($ss2->[0]{sheets} sheets)\n";
foreach my $s (1 .. max map { $_->[0]{sheets} } $ss1, $ss2) {
    my $s1 = $ss1->[$s];
    my $s2 = $ss2->[$s];
    unless ($s1) {
	print "$s: not in $file1\n";
	last;
	}
    unless ($s2) {
	print "$s: not in $file2\n";
	last;
	}

    printf "Sheet %d\n\t< %5d x %5d %s\n\t> %5d x %5d %s\n", $s,
	$s1->{maxcol}, $s1->{maxrow}, $s1->{label},
	$s2->{maxcol}, $s2->{maxrow}, $s2->{label};

    my $mc = max map { $_->{maxcol} } $s1, $s2;
    foreach my $r (1 ..  max map { $_->{maxrow} } $s1, $s2) {
	if ($r > $s1->{maxrow}) {
	    print "$s: EOS in $file1 at row $r\n";
	    last;
	    }
	if ($r > $s2->{maxrow}) {
	    print "$s: EOS in $file2 at row $r\n";
	    last;
	    }
	my @r1 = Spreadsheet::Read::row ($s1, $r);
	my @r2 = Spreadsheet::Read::row ($s2, $r);
	foreach my $c (1 ..  $mc) {
	    my $c1 = $r1[$c];
	    my $c2 = $r2[$c];
	    if (defined $c1) {
		if (defined $c2) {
		    $c1 eq $c2 and next;
		    print "$s: ($r, $c)\n\t< $c1\n\t> $c2\n";
		    next;
		    }
		print "$s: ($r, $c)\n\t< $c1\n\t> -- undefined --\n";
		next;
		}
	    defined $c2 or next;
	    print "$s: ($r, $c)\n\t< -- undefined --\n\t> $c2\n";
	    }
	}
    }