http://qs321.pair.com?node_id=11128127


in reply to Unable to compare 2 arrays from 2 separate columns of separate sheets.

You seem to be using a spreadsheet module. Which one is it? Please, try to provide a SSCCE so we can run your code and experiment with the fixes.

map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
  • Comment on Re: Unable to compare 2 arrays from 2 separate columns of separate sheets.
  • Download Code

Replies are listed 'Best First'.
Re^2: Unable to compare 2 arrays from 2 separate columns of separate sheets.
by chandantul (Scribe) on Feb 09, 2021 at 17:53 UTC

    Thanks! Can you please check my code snippet and let me know the exact issue while updating unique values after comparison or where i am doing wrong here?

    #!/usr/bin/env perl use strict; no warnings; use Spreadsheet::XLSX; use Spreadsheet::ParseXLSX; use Excel::Writer::XLSX; my $appsshhetname = "syslog_-prod"; my $ADdata = "AD-Data"; my $no = "NOt exist"; my $cellA; my $cellB; my $cellC; our @cellA; our @cellC; our @redi; my $responseid; my $row; my %params; my $workbook = Excel::Writer::XLSX->new( 'C:/PERL/SYNC-OKTA-User-Prof +ile-Apps-Analysis-Details.xlsx' ); my $worksheet = $workbook->add_worksheet(); my $r = 1; my $my_format = $workbook->add_format( bold => 1, color => 'blue', size => 18, ); my $ +parser = Spreadsheet::ParseXLSX->new(); my $workbook1 = $parser->parse('C:/Users/Documents/Work.xl +sx'); if ( !defined $workbook1 ) { die $parser->error(), ".\n"; } for my $worksheet1 ( $workbook1->worksheets() ) { $worksheet->write(0, 0, 'AD Match' , $my_format); $worksheet->write(0, 2, 'AD MATCH' , $ +Synchrony_format); $worksheet->write(0, 3, 'Creation Date +' , $Synchrony_format); my $appssheet = $worksheet1->get_name( +); for $row ( $row_min .. $row_max ) { for my $col ( $col_min = 0) { if ( $appssheet eq $appsshhetname ) { my $cell = $worksheet1->get_cell( $row, 1 ); next unless $cell; $cellA = $cell->value(); #$cellA =~ s/@(.*)//g; $cellA =~ s/@(AD.ABC.COM)//g; if ( $cellA=~ /(\d{9})/ ) { push @cellA, $cellA; #print "DUMP: @cellA"; } } #print "$cellA \n"; %params = map { $_ => 1 } @cellA; #print Dumper %params; my @uniq = keys %params; if ( $appssheet eq $ADdata ) { for my $row1 ( $row_min .. $row_max ) { for my $col1 ( $col_min = 1) { my $cellB = $worksheet1->get_cell( $row, 1 ); next unless $cellB; $cellC = $cellB->value(); #$cellC =~ s/@(AD.ABC.COM)//g; #print "2nd Entry :$cellC\n"; #push @cellC , $cellC; if(exists($params{$cellC})) { $worksheet->write($r, 0, $cellC); } else { #$worksheet->write($r, 0, $no); } } } $r += 1; }
      You should fix the indentation. Also, SSCCE should compile, but yours doesn't, as it contains several undeclared variables. I was able to fix it, I also created an input XLSX document with two sheets, one of them called AD-Data containing
      1 123456789 2 123456790 3 123456791 4 123456792 5 123456793 6 123456794 7 123456795 8 123456796
      and another called syslog_-prod containing
      1 2 6 123456789 11 123456790 16 123456791 21 123456792 26 123456793 31 123456794 36 123456795 41 123456796
      Running the edited code

      I got no errors nor warnings and the output file was created with a coloured header and the following contents in the first column:

      123456790 123456791 123456792 123456793
      but formatted as 1.23E+08.

      Sorry, what was your question again?

      map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

        The infinity loop for the below comparison code is my issue. The ADdata sheet first column contain 1-30000 users data and prod_log sheet contain around 501 entries of users those are Nonunique . I will need to collect unique entries from prod_log first column and compare against ADdata sheet first column and update the existing entries of the same file and update the match to other file. The above code seems to be not working. need some suggestion or code snippet.

        for my $worksheet1 ( $workbook1->worksheets() ) { my ( $row_min , $row_max) = $worksheet1->row_range(); my ($col_min, $col_max) = $worksheet1->col_range(); $worksheet->write(0, 0, 'AD Match' , $my_format); $worksheet->write(0, 1, 'APP STATUS' , + $my_format); $worksheet->write(0, 2, 'APP LABEL' , +$my_format); my $appssheet = $worksheet1->get_name(); print "APP Sheet name: $appssheet . \n"; for my $row ( $row_min .. $row_max ) { for my $col ( $col_min = 0) { if ( $appssheet eq $appsshhetname ) { my $cell = $worksheet1->get_cell( $row, 0 ); next unless $cell; my $cellA = $cell->value; push @cellA, $cellA ; # push @cellA, $cellA if $cellA=~ /(\d{9})/; } my %params = map { $_ => 1 } @cellA; my @uniq = keys %params; if ( $appssheet eq $ADdata ) { for my $row1 ( $row_min .. $row_max ) { for my $col1 ( $col_min = 0) { my $cellB = $worksheet1->get_cell( $row, 0 ); next unless $cellB; my $cellC = $cellB->value; $cellC =~ s/@(AD.ABC.COM)//g; print "USERS: $cellC\n"; $worksheet->write($r, 0, $cellC) if exists $pa +rams{$cellC}; } } $r += 1; } } } }