日経平均株価を取得してDBに格納する【準備編】
phpでスクレイピングした日経平均株価をDBに格納してグラフにするようなプログラムを作りたいと思います。
まずはmysqlにテーブルを用意します。今回はとりあえず、平均株価と日付のカラムだけを持つシンプルなテーブルを用意しました。
create table YAHOO_NIKKEI_STOCK(VALUE float(9,3),SAMPLING_DATE TIMESTAMP);
さて、実際にはここで作ったテーブルにレコードを追加していくわけですが、ちゃんと値が入るのかテストがしたいです。そこで、YAHOO_NIKKEI_STOCK_TESTという同じ構造のテーブルを作り、そこにサンプルデータをphpから追加するテストをしてみました。
<?php date_default_timezone_set('Asia/Tokyo'); $dnsinfo = "mysql:dbname=finance;host=localhost;charset=utf8"; $user = "FinanceUser"; $pw = "XXXXXXXX"; try{ $pdo = new PDO($dnsinfo,$user,$pw); $query = "insert into YAHOO_NIKKEI_STOCK_TEST values(?,?)"; $stmt = $pdo->prepare($query); $stmt->execute(array(134567.00,date("YmdHis"))); }catch(PDOException $e){ echo $e->getMessage(); } ?>
コマンドラインから試したので、結果をコピペできないのが残念ですが、ちゃんとテーブルにinsertできました。
yahooの日経株価を正規表現で抜き出す
<?php $ch = curl_init("http://stocks.finance.yahoo.co.jp/stocks/detail/?code=998407.O"); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_HEADER,false); $str = curl_exec($ch); curl_close($ch); preg_match("/(<td\s*class=\"stoksPrice\"\s*>)(.*?)(<\/td>)/",$str,$result); echo $result[2]; ?>
yahooファイナンスの日経平均株価のページをcurlでダウンロードする
経済のことを勉強したいなあと思ってとりあえず手を動かしてみた、という感じですが、そもそも日経平均株価が何の役に立つのかわからないし、一日に一ページじゃ意味ないような気もするのですが、とりあえずやってみました。
<?php $ch = curl_init("http://stocks.finance.yahoo.co.jp/stocks/detail/?code=998407.O"); date_default_timezone_set('Asia/Tokyo'); $filename = "YahooFinance".date("Ymd"); echo $filename; if(!file_exists($filename)){ $fp = fopen($filename,"w"); }else{ exit; } curl_setopt($ch,CURLOPT_FILE,$fp); curl_setopt($ch,CURLOPT_HEADER,0); curl_exec($ch); curl_close($ch); fclose($fp); ?>
一定期間を過ぎたファイルを別のディレクトリに移動するメソッド
import java.io.File; import java.util.Date; public class MoveOldFile { public void move(String targetDir,Integer elapse){ File dir = new File(targetDir); File[] files = dir.listFiles(); String movePath = "c:\\oldFiles\\"; String filename = ""; Date today = new Date(); long dayTime = 24 * 60 * 60 * 1000; long diff = 0; for(File file : files){ if(file.isDirectory())continue; diff = (today.getTime() - file.lastModified())/dayTime; if(diff > elapse){ filename = file.getName(); File moveFile = new File(movePath + filename); file.renameTo(moveFile); } } } }
一時ファイルを利用してファイルの内容を置換
public class UpdateFiles { public static void main(String[] args) throws IOException{ String fileName = "c:\\works\\Java\\baseFile.txt"; File file = new File(fileName); String tmpFileName = file.getAbsolutePath() + Long.toString(System.currentTimeMillis()); File tmpFile = new File(tmpFileName); file.renameTo(tmpFile); file.createNewFile(); BufferedReader br = new BufferedReader(new FileReader(tmpFile)); FileWriter out = new FileWriter(file); String line; Pattern p = Pattern.compile("pattern"); Matcher m ; while((line = br.readLine()) != null ){ m = p.matcher(line); line = m.replaceAll("replace"); out.write(line + "\r\n"); } br.close(); tmpFile.delete(); out.close(); } }
あるディレクトリに含まれるFileインスタンスをArrayListに格納して返す
そもそもが配列で返ってくるものをArrayListにしたところで何になるのかという疑問がありつつも……
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; public class DirList { public ArrayList<File> filesList(String filePath) throws FileNotFoundException{ File dir = new File(filePath); if(!dir.exists()){ throw new FileNotFoundException(); } ArrayList<File> files = new ArrayList<File>(); File[] _files = dir.listFiles(); for(File file: _files){ files.add(file); } return files; } }
ランダムな文字列を生成するメソッド
commonsとか使えばいい話ではあるんですけど、、、
package csv; import java.util.Random; public class RandomString { private Integer length; RandomString(){ this.length = 10; } RandomString(int _len){ this.length = _len; } public String getRandomStr(){ String result = ""; Random rand = new Random(); char c; for(int i=0;i < this.length;i++){ c = (char)(rand.nextInt(58)+65); result += String.valueOf(c); } return result; } public String getRandomStr(int _len){ String result = ""; Random rand = new Random(); char c; for(int i=0;i < this.length;i++){ c = (char)(rand.nextInt(58)+65); result += String.valueOf(c); } return result; } }