App-ygeo
view release on metacpan or search on metacpan
lib/App/ygeo.pm view on Meta::CPAN
if ( ref($columns) eq 'ARRAY' && ref( $company->$p ) eq 'ARRAY' ) {
my $fact_size = scalar @{ $company->$p }; # check to not
my $max_size_acc_split = scalar @$columns;
my $size = _lower( $max_size_acc_split, $fact_size );
push @row, $company->$p->[ $_ - 1 ] for ( 1 .. $size );
if ( $fact_size < $max_size_acc_split ) {
my $l = $max_size_acc_split - $fact_size;
push @row, undef for ( 1 .. $l );
}
next;
}
}
if ( scalar @header != scalar @row ) {
carp "Row may be formatted wrong, there must be "
. scalar @header
. " columns, but it is "
. scalar @row;
$result_flag = 0;
}
$text_csv->print( $fh, \@row );
}
return $result_flag;
}
sub _isin($$) {
my ( $val, $array_ref ) = @_;
return 0 unless $array_ref && defined $val;
for my $v (@$array_ref) {
return 1 if $v eq $val;
}
return 0;
}
# Return lower value from two values
sub _lower {
my ( $val1, $val2 ) = @_;
return ( $val1 > $val2 ) ? $val2 : $val1;
}
sub get_and_print {
my ( $self, %params ) = @_;
my $text = $params{text};
croak "No search text defined" unless defined $text && length $text;
my $city = $self->{city} || $params{city};
my $csv_filename = $params{csv_filename} || $params{text} . '.csv';
my $csv = Text::CSV->new()
or die "Cannot use CSV: " . Text::CSV->error_diag();
$csv->eol("\012");
$csv->sep_char(";");
open my $fh, ">:encoding(utf8)", $csv_filename or die "$csv_filename: $!";
my $yndx_geo = Yandex::Geo->new(
apikey => $self->{apikey},
only_city => $city,
results => $params{results_limit} || 500
);
my $res = $yndx_geo->y_companies($text);
no warnings 'utf8';
say "Search: $text in city: $city"
if ( $self->{verbose} || $params{verbose} );
say "Yandex Maps API key: $self->{apikey}"
if ( $self->{verbose} || $params{verbose} );
say "Companies found: " . scalar @$res
if ( $self->{verbose} || $params{verbose} );
_print2( $csv, $fh, $res, { phones => 3 } );
close $fh or die "$csv_filename: $!";
no warnings 'utf8';
say "Data was written in $csv_filename"
if ( $self->{verbose} || $params{verbose} );
return 1;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
App::ygeo - Extract companies data from Yandex Maps to csv file
=head1 VERSION
version 0.02
=head1 SYNOPSIS
use App::ygeo;
my $ygeo = App::ygeo->new( apikey => '12345', city => "ROV" );
$ygeo->get_and_print(text => 'autoservice', city => 'ROV', csv_filename => 'auto.csv', verbose => 1);
=head1 DESCRIPTION
By default it:
get data about maximum 500 companies (Yandex API restriction)
Order of looking for apikey
( run in 1.487 second using v1.01-cache-2.11-cpan-5a3173703d6 )