1. 時系列オッズの取得
速報系のデータの保存期間は、一週間ですが時系列に限って(蓄積系に代用できるデータがない
せいか)保存提供期間が一年間になっています。
sSeia は、このデータを眺めることはあるのですが、実際に馬券検討に使ったことはありません。
しかし、全く意味がないとも言い切れず一応取得する方法だけを考えてみました。
速報系データ取得は、JVRTOpen を使い、パラメータは dataspec と key です。
key は YYYYMMDDJJRR または YYYYMMDDJJKKHHRR のフォーマットで指定するわけ
ですが、
レースNo.(RR)以外は、開催スケジュールから切り出すことにします。
ということで 該当年の開催スケジュールがないと、その年の時系列が取得できません。
JVSET.ini の YSCHTime を 20041225000000 くらいに書き換えれば2004年の開催スケジュール
が取得できる筈です。YSNW20049999.dat が取得されていればOKで、
準備はこれだけです。
が、、、古い時系列データを取得するのはいいのですが、当然のことながらファイルサイズはかな
りの大きさです。そのうえ、結構時間がかかります。覚悟してやってください。
他オッズとは違うディレクトリに保存する方がよさそうですね。
↑ この部分は、ini ファイルとスクリプトと共に修正の必要があります。
いまさら、お手本というレベルでもないとおもうので、この辺は自分で修正ですかね。
ファイル名に関しては、他の速報オッズ系とは違うようなので工夫が必要です。
下の例を参考にしてください。保存ファイル( $fname )のあたりです。
一応、JVD_OLE.pl のなかに置けば(多分)動く サブルーチンです。
sub jikretu {
my @keys ;
my $ymdbr ;
my $dir = $cfg->param("pass.rcovP") ;
# my $f2004 = "${dir}YSNW20049999.dat" ; # 2004年 -------------
# open DAT, $f2004 ;
# while ( <DAT> ) {
# my ( $m, $n ) = unpack '@2 A1 @11 A10', $_ ;
# next unless $m == 3 ;
# ## まぁ、2004年6月からということにしますか。
# next if $n < 2004060000 ;
# push @keys, $n ;
# }
# close DAT ;
my $f2005 = "${dir}YSNW20059999.dat" ; # 2005年 -------------
open DAT, $f2005 ;
while ( <DAT> ) {
my ( $m, $n ) = unpack '@2 A1 @11 A10', $_ ;
next unless $m == 3 ;
## まぁ、試しで今年の 6月以降を
next if $n < 2005060000 ;
push @keys, $n ;
}
close DAT ;
# -----------------------------------------------------------------
for my $i ( @keys ) {
for my $j ( 1..12 ) {
my $jj = sprintf "%02d", $j ;
$ymdbr = $i . $jj ;
&get_jikr( $oz_jktf ) ;
&get_jikr( $oz_jkur ) ;
}
}
sub get_jikr { # 引数はリファレンス( 種別ID、仮サイズ、保存用パス)
my ( $ds, $bs, $ps ) = @{ shift() } ;
my $rtn = $jvd->JVRTOpen( $ds, $ymdbr ) ;
my $i = 0 ;
RTR: while ( $rtn < -400 or $rtn == -1 ){
sleep 1 ;
$rtn = $jvd->JVRTOpen( $ds, $ymdbr ) ;
$i++ ;
last RTR if $i > 2 ;
}
my $dname = substr( $ymdbr, 0, 8 ) ;
if( $rtn == 0 ) {
my $dir = $cfg->param( $ps ) ;
mkdir "$dir$dname" unless -d "$dir$dname" ;
$dir .= $dname . '/' ;
my $bsize = Variant( VT_I4, $bs ) ;
my $pbuf = Variant( VT_UI1, "\x00" x $bs ) ;
my $buff = Variant( VT_BSTR|VT_BYREF, \$pbuf ) ;
my $fn = Variant( VT_BSTR|VT_BYREF, '' ) ; # ファイル名
my $flg ;
my $i = 0 ;
my @dat = () ;
while ( $flg = $jvd->JVRead( $buff, $bsize, $fn ) ) {
if( $flg > 0 ) {
$dat[$i] = $buff->Value() ;
$i++ ;
} elsif( $flg == -1 ) {
my ( $zen, $gon ) = unpack '@0 A4 @22 A4', $fn ;
my $fname = $dir . $zen .$gon . '.dat' ;
open DAT, ">$fname" ;
for ( @dat ) {
s/\x00+//g ; s/\r// ;
print DAT $_ ;
}
close DAT ;
@dat = () ; $i = 0 ;
print "\t\t読み込み完了。→ : $fn\n" ;
} else {
print " 時系列データ・読み込みエラー。 $flg\n" ;
}
}
} elsif( $rtn == -1 ) {
print "時系列・該当データがありません。$rtn\n" ;
} elsif ( $rtn == -504 ) {
print "サーバーメンテナンス中。\n" ;
} else {
print "OPENエラー。$rtn\n" ;
}
&jv_close() ;
}
}
期間を指定するのなら、 next if の行で指定するといいと思います。
2004年の分を取得する場合は、# でコメントアウトしている行を使うので、行頭の # を
削除ですね。
↑ では、1〜12R まで取得していますが、
for my $j ( 1..12 ) {
の行を修正することで、8〜11R とかも可能です。このへんはアタマ使ってください。
ここまでの、JVD_OLE.pl と iniファイルは
⇒⇒ 前回シリーズの最終章
に残してあります。