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 )