あっという間の十年ブログ【Ruby篇】

"詮ずるところ#{プログラミング}は、ただ年月長く倦まずおこたらずして、はげみつとむるぞ肝要にて、学びやうは、いかやうにてもよかるべく、さのみかかはるまじきことなり。いかほど学びかたよくても、おこたりてつとめざれば、功はなし。また、人々の才と不才とによりて、その功いたく異なれども、才不才は、生まれつきたることなれば、力に及びがたし。されど、大抵は、不才なる人といへども、おこたらずつとめだにすれば、それだけの功は有る物なり。" - 本居宣長

PerlでデータをMysqlに送る(insert)

Excelで管理していたデータをMysqlに移行させることにした。記録データ(html)からスクレイピングしてMysqlに送る。(後でわかったけどcsvから一発でMysqlにぶち込むことも可能。)

まずテーブルをつくっておく。
record.sql

create table record (
    id int not null auto_increment primary key,
    score double,
    url varchar(255),
    memo text,
    created date
);

記録データ(html)のDataをvimで変更(置換)

:%s/12.10./2012-10-/g
:%s/12.11./2012-11-/g

scraper.pl

use Web::Scraper;
use URI;
use DBI;

my $dbh = DBI->connect('DBI:mysql:DATABASENAME','USERNAME','PASSWD');

my $scraper = scraper {
    process ".data", "data[]"  => "TEXT";
    process ".time", "score[]" => "TEXT";
    process ".url a",  "url[]" => '@href';
};

my $res = $scraper->scrape( URI->new("http://www43.atpages.jp/ukie/ona/record.html"));

for (0..34) {
    my $data  = shift @{ $res->{data} };
    my $score = shift @{ $res->{score} };
    my $url   = shift @{ $res->{url} };

    my $sth = $dbh->prepare("insert into record (score,url,created) value ($score,?,?)");
    $sth->execute($url,$data);
    $sth->finish;
}
$dbh->disconnect;