気象庁の気象データ(最低気温)をMySQLに保存する
以下のページから気象庁のデータをcsv形式で取得できるため、 それをMySQLに保存するプログラムをphpでざっくり書いてみました。 www.data.jma.go.jp
index.php
<?php try{ $pdo = new PDO( "mysql:dbname=test;host=127.0.0.1;charset=utf8mb4;", 'root', '', [ PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_NUM, ] ); $pdo->exec( "CREATE TABLE IF NOT EXISTS lowest( `観測所番号` INT(11) NOT NULL PRIMARY KEY ,`都道府県` VARCHAR(50) ,`地点` VARCHAR(50) ,`国際地点番号` INT(11) ,`現在時刻(年)` INT(11) ,`現在時刻(月)` INT(2) ZEROFILL ,`現在時刻(日)` INT(2) ZEROFILL ,`現在時刻(時)` INT(2) ZEROFILL ,`現在時刻(分)` INT(2) ZEROFILL ,`今日の最低気温(℃)` FLOAT ,`今日の最低気温の品質情報` INT(2) ,`今日の最低気温起時(時)` INT(2) ZEROFILL ,`今日の最低気温起時(分)` INT(2) ZEROFILL ,`今日の最低気温起時の品質情報` INT(2) ,`平年差(℃)` FLOAT ,`前日差(℃)` FLOAT ,`該当旬(月)` INT(2) ,`該当旬(旬)` INT(2) ,`極値更新` INT(2) ,`10年未満での極値更新` INT(2) ,`今季最低` INT(2) ,`今年の最低気温(℃)(昨日まで)` FLOAT ,`今年の最低気温(昨日まで)の品質情報` INT(2) ,`今年の最低気温(昨日まで)を観測した起日(年)` INT(11) ,`今年の最低気温(昨日まで)を観測した起日(月)` INT(2) ZEROFILL ,`今年の最低気温(昨日まで)を観測した起日(日)` INT(2) ZEROFILL ,`昨日までの観測史上1位の値(℃)` FLOAT ,`昨日までの観測史上1位の値の品質情報` INT(2) ,`昨日までの観測史上1位の値を観測した起日(年)` INT(2) ,`昨日までの観測史上1位の値を観測した起日(月)` INT(2) ZEROFILL ,`昨日までの観測史上1位の値を観測した起日(日)` INT(2) ZEROFILL ,`昨日までの1月の1位の値` FLOAT ,`昨日までの1月の1位の値の品質情報` INT(2) ,`昨日までの1月の1位の値の起日(年)` INT(2) ,`昨日までの1月の1位の値の起日(月)` INT(2) ZEROFILL ,`昨日までの1月の1位の値の起日(日)` INT(2) ZEROFILL ,`統計開始年` INT(11) ) DEFAULT CHARSET=utf8;" ); $pdo->exec( "TRUNCATE TABLE lowest; LOAD DATA INFILE '".str_replace('\\','/',__DIR__)."/lowest.csv' INTO TABLE lowest FIELDS TERMINATED BY ',' IGNORE 1 LINES ( @field1 ,@field2 ,@field3 ,@field4 ,@field5 ,@field6 ,@field7 ,@field8 ,@field9 ,@field10 ,@field11 ,@field12 ,@field13 ,@field14 ,@field15 ,@field16 ,@field17 ,@field18 ,@field19 ,@field20 ,@field21 ,@field22 ,@field23 ,@field24 ,@field25 ,@field26 ,@field27 ,@field28 ,@field29 ,@field30 ,@field31 ,@field32 ,@field33 ,@field34 ,@field35 ,@field36 ,@field37 ) SET `観測所番号` = nullif(@field1,'') ,`都道府県` = nullif(@field2,'') ,`地点` = nullif(@field3,'') ,`国際地点番号` = nullif(@field4,'') ,`現在時刻(年)` = nullif(@field5,'') ,`現在時刻(月)` = nullif(@field6,'') ,`現在時刻(日)` = nullif(@field7,'') ,`現在時刻(時)` = nullif(@field8,'') ,`現在時刻(分)` = nullif(@field9,'') ,`今日の最低気温(℃)` = nullif(@field10,'') ,`今日の最低気温の品質情報` = nullif(@field11,'') ,`今日の最低気温起時(時)` = nullif(@field12,'') ,`今日の最低気温起時(分)` = nullif(@field13,'') ,`今日の最低気温起時の品質情報` = nullif(@field14,'') ,`平年差(℃)` = nullif(@field15,'') ,`前日差(℃)` = nullif(@field16,'') ,`該当旬(月)` = nullif(@field17,'') ,`該当旬(旬)` = nullif(@field18,'') ,`極値更新` = nullif(@field19,'') ,`10年未満での極値更新` = nullif(@field20,'') ,`今季最低` = nullif(@field21,'') ,`今年の最低気温(℃)(昨日まで)` = nullif(@field22,'') ,`今年の最低気温(昨日まで)の品質情報` = nullif(@field23,'') ,`今年の最低気温(昨日まで)を観測した起日(年)` = nullif(@field24,'') ,`今年の最低気温(昨日まで)を観測した起日(月)` = nullif(@field25,'') ,`今年の最低気温(昨日まで)を観測した起日(日)` = nullif(@field26,'') ,`昨日までの観測史上1位の値(℃)` = nullif(@field27,'') ,`昨日までの観測史上1位の値の品質情報` = nullif(@field28,'') ,`昨日までの観測史上1位の値を観測した起日(年)` = nullif(@field29,'') ,`昨日までの観測史上1位の値を観測した起日(月)` = nullif(@field30,'') ,`昨日までの観測史上1位の値を観測した起日(日)` = nullif(@field31,'') ,`昨日までの1月の1位の値` = nullif(@field32,'') ,`昨日までの1月の1位の値の品質情報` = nullif(@field33,'') ,`昨日までの1月の1位の値の起日(年)` = nullif(@field34,'') ,`昨日までの1月の1位の値の起日(月)` = nullif(@field35,'') ,`昨日までの1月の1位の値の起日(日)` = nullif(@field36,'') ,`統計開始年` = nullif(@field37,'');" ); // 都道府県ごとの最低気温を出力する $query=$pdo->query( "SELECT CONCAT( STR_TO_DATE(CONCAT(`現在時刻(年)`,`現在時刻(月)`,`現在時刻(日)`,`現在時刻(時)`,`現在時刻(分)`),'%Y%m%d%H%i') ,'\t',`今日の最低気温(℃)` ,'\t',`都道府県` ,'\n' ) FROM lowest WHERE `観測所番号` IN ( SELECT MAX(`観測所番号`) FROM lowest WHERE ((`都道府県`,`今日の最低気温(℃)`)IN( SELECT `都道府県`,MIN(`今日の最低気温(℃)`) FROM lowest GROUP BY `都道府県` )) GROUP BY `都道府県` )" ); header('Content-Type:text/plain;charset=UTF-8'); foreach($query->fetchAll() as $key => $r){ echo $r[0]; } }catch(PDOException $e){ exit($e->getMessage()); }
以下のページのcsvデータをlowest.csvとして、phpと同じ場所に保存 http://www.data.jma.go.jp/obd/stats/data/mdrr/tem_rct/alltable/mntemsadext00_rct.csv
php実行
北海道寒い!