App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Suffix/RBA.pm view on Meta::CPAN
(16,0, App::Chart::TZ->sydney),
'16:01:00');
}
sub threeday_available_tdate {
my ($iso, $time) = threeday_available_date_time();
return App::Chart::Download::iso_to_tdate_floor ($iso);
}
sub threeday_parse {
my ($resp) = @_;
my @data = ();
my $h = { url => RBA_EXCHANGE_URL,
copyright => RBA_COPYRIGHT_URL,
source => __PACKAGE__,
resp => $resp,
cover_pred => $pred,
data => \@data };
my $content = $resp->decoded_content(raise_error=>1);
# mung <tr id="USD"> to add <td>USD</td> so it appears in the TableExtract
$content =~ s{<tr>}{<tr><td></td>}ig;
$content =~ s{(<tr +id="([^"]*)">)}{$1<td>$2</td>}ig;
require HTML::TableExtract;
my $te = HTML::TableExtract->new
(
# is now a <caption>
# headers => ['Units of foreign currency per'],
slice_columns => 0);
$te->parse($content);
my $ts = $te->first_table_found();
if (! $ts) { die "RBA: html table not found\n"; }
my $rows = $ts->rows();
my $lastrow = $#$rows;
my $lastcol = $#{$rows->[0]};
# date like "03 Sep 2007"
my @dates;
foreach my $c (2 .. $lastcol) {
$dates[$c] = App::Chart::Download::Decode_Date_EU_to_iso($rows->[0]->[$c]);
}
$h->{'lo_date'} = List::Util::minstr (grep {defined} @dates);
foreach my $r (1 .. $lastrow) {
my $row = $rows->[$r];
my $symbol = $row->[0] // next;
$symbol =~ s/_.*//; # _4pm on TWI
$symbol = "AUD$symbol.RBA";
my $name = $row->[1];
$name =~ s/ \(4pm\)$//; # 4pm on TWI
foreach my $c (2 .. $lastcol) {
my $rate = $row->[$c];
# bank holiday columns have "BANK HOLIDAY" with one letter per row or
# blank which comes through as undef, skip those
next if ! Scalar::Util::looks_like_number($rate);
push @data, { symbol => $symbol,
name => $name,
date => $dates[$c],
last_time => '16:00:00',
close => $rate,
currency => substr($symbol,3,3),
};
}
}
return $h;
}
#------------------------------------------------------------------------------
# latest quotes
App::Chart::LatestHandler->new
(pred => $pred,
url_tags_key => 'RBA-latest',
proc => \&latest_download,
available_date_time => \&threeday_available_date_time);
sub latest_download {
my ($symbol_list) = @_;
App::Chart::Download::status (__('RBA past three days'));
my $resp = App::Chart::Download->get (RBA_EXCHANGE_URL,
url_tags_key => 'RBA-latest');
App::Chart::Download::write_latest_group (threeday_parse ($resp));
}
#------------------------------------------------------------------------------
# historical xls page
#
# This downloads and parses up the page:
# https://www.rba.gov.au/statistics/historical-data.html
#
# 2014 to present
# https://www.rba.gov.au/statistics/tables/csv/f11.1-data.csv
# 213k or 47k compressed, also byte ranges
# https://www.rba.gov.au/statistics/tables/xls-hist/2014-current.xls
# 438k
#
use constant RBA_HISTORICAL_PAGE_URL =>
'https://www.rba.gov.au/statistics/hist-exchange-rates/index.html';
#
# which offers various xls files for past rates.
sub historical_info {
require App::Chart::Pagebits;
return App::Chart::Pagebits::get
(name => __('RBA historical page'),
url => RBA_HISTORICAL_PAGE_URL,
key => 'rba-historical',
freq_days => 1,
parse => \&historical_parse);
}
( run in 0.532 second using v1.01-cache-2.11-cpan-39bf76dae61 )