http://www.perlmonks.org?node_id=647217


in reply to Re^2: Data::Table - empty values - avoid warnings
in thread Data::Table - empty values - avoid warnings

okay thanks a lot. I'm almost there but found out that actually the columns I'm working on have a lot of numbers that have as a decimal separator a 'comma'. For example in the blank spot number like 2,3 as opposed to the 'space'. To work around that I thought to do
sub to_int_or_zero { my $value = shift; $value =~ s/,/\./; if (defined($value) && $value =~ m/^\d+$/) { return $value; } else { return 0; } }
but it doesn't work. The 2,3 nicely changes into 2.3 but I'm obviously making a very elementary mistake that I can't understand myself at this moment as the row adds up to ... 3
: (

Replies are listed 'Best First'.
Re^4: Data::Table - empty values - avoid warnings
by eric256 (Parson) on Oct 25, 2007 at 16:39 UTC
      uhm, well. The numbers with comma's as delimiters are just there and just can't seem to get to 5.3 as the result of the calculation. Well, we'll just go on and a hint is appreciated.
      Looked at the regex and now asking myself how to implement that.
        okay I'm there for the moment. Thank you all.
        I finally put the regex, I was adviced to use, in the place where it works. Code below could be improved because when starting the first column with a 'space' or nothing there won't show up a 0 (zero) in the column but that also wasn't really where I was after.
        Thangs again, rethinking the issue made me learn and get to a solution.
        #!/usr/bin/perl use strict; use warnings; use Data::Table; my $t = new Data::Table( [ [ "1", "2", "3" ], [ "10", "20", "2,3" ] ], [ "A" +, "B" ], 1 ); # create emtpy column my @newCol = (); $newCol[ $t->nofRow - 1 ] = undef; $t->addCol( \@newCol, 'adding_up' ); # to change , into . in respective columns # not needed for a correct calculation of col3 though $t->colsMap( sub { $_->[0] =~ s/,/\./g } ); $t->colsMap( sub { $_->[1] =~ s/,/\./g } ); # Return input if input is an integer, otherwise zero sub to_int_or_zero { my $value = shift; if ( defined($value) # the regex that above hints pointed at. && $value =~ /^-?\d+\.?\d*$/ ) { return $value; } else { return 0; } } # Put the formula in the empty column $t->colsMap( sub { $_->[2] = to_int_or_zero( $_->[0] ) + to_int_or_zero( $_->[1] +); } ); print $t->csv;