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

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; }
  • Comment on Re^2: Unable to compare 2 arrays from 2 separate columns of separate sheets.
  • Download Code

Replies are listed 'Best First'.
Re^3: Unable to compare 2 arrays from 2 separate columns of separate sheets.
by choroba (Cardinal) on Feb 09, 2021 at 20:05 UTC
    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; } } } }

        This works after making modification for loop scope of writer in excel, i have separated the parser with excel writer for loop that wors for me.