気象庁の気象データ(最低気温)を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実行

f:id:okumuraa1:20180127181550p:plain

北海道寒い!