ホーム  •  ニュース  •  フォーラム  •  アカウント情報  •  サイト内検索  •  新規登録
 ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
 カウントダウンブロック
カウントダウンイベントはありません
 メニュー

[掲示板に戻る全部  1-  最新50
1 大気汚染常時監視測定データ処理用 perl スクリプトのプロトタイプ



森 2004-12-16 23:08:59  [返信] [編集]

東京都の大気汚染常時監視測定データ処理用 perl スクリプトのプロトタイプです。サイトはこちら

連続的に集計や統計処理をするには、どうも書式が気になります。特に風向風速。
そこで、次のようなスクリプトを組んでみました。ご参考まで。
#! /usr/bin/perl
##################################
#
# perl 5.6 からは、UTF-8 は普通に使える。
#
# が、このスクリプト自身が EUC なので、各ファイルは nkf -e を通した後、このスクリプトを通過すべき。
#
##################################
%direction=(
            '   N',    00.0,
            ' NNE',  22.5,
            '  NE',   45.0,
            ' ENE',  67.5,
            '   E',    90.0,
            ' ESE', 112.5,
            '  SE',  135.0,
            ' SSE', 157.5,
            '   S',   180.0,
            ' SSW', 202.5,
            '  SW',  225.0,
            ' WSW', 247.5,
            '   W',   270.0,
            ' WNW', 292.5,
            '  NW',  315.0,
            ' NNW', 337.5,
            '   C', -1,
            );
$selectflag=0;
$winddtflag=0;
$firstflag=1;
while($line = <>){
    if( $line =~ /^#/ ){
        next;
    }elsif( $line =~ /(.*)日,([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*)$/){
        @data=($2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25);
        if( $selectflag == 1 ){
            if( $winddflag == 1 ){
                print $1;
                foreach $name ( @data ){
                    printf("%6.1f", $direction{$name});
                }
            }else{
                print $1, @data;
            }
            print "\n";
        }
    }elsif( $line =~ /[^,]*,測定場所,[^,]*,([^ ,]*)[ ]*,項目,[^,]*,([^, ]*)[ ]*,単位,.*/ ){
        $PLACE = $1;
        $KIND  = $2;
        if( $firstflag == 1 ){
            print $PLACE,"\n";
            $firstflag = 0;
        }
        if( $KIND =~ "^風向\$" || $KIND =~ "^風速\$" ){
            $selectflag = 1;
            if( $KIND =~ "^風向\$" ){
                $winddflag=1;
            }else{
                $winddflag=0;
            }
        }else{
            $selectflag = 0;
        }
    }
}
2 Re: 大気汚染常時監視測定データ処理用 perl スクリプトのプロトタイプ



森 2004-12-20 0:06:52  [返信] [編集]

ちょっとバージョンアップしました。風向等に限らない汎用的なスクリプトになっています。御覧になればわかりますが、データの配列を変えただけです。
東京都大気汚染常時監視測定データ で得られるデータ用です。
#! /usr/bin/perl
##################################
#
# ファイル名 cutOsenData.pl
#
# Author           : Atsusih Mori
# Last Modified On : Sun, 19 Dec 2004 23:55:54 +0900
# Status           : Working, but use with caution!
# License: GPLv2
#
##################################
#
# 東京都大気汚染常時監視測定データ(http://www2.kankyo.metro.tokyo.jp/kansi/taiki/download/data_download_top.htm)
# で得られる CSV のデータを、R で処理しやすくするためのスクリプト
#
# perl 5.6 からは、UTF-8 は普通に使える。
# が、このスクリプト自身が EUC なので、各ファイルは nkf -e を通した後、このスクリプトを通過すべき。
#
# 使用例 :
#         nkf -e a*.csv | ./cutOsenData.pl > alldata.txt
#
##################################
#
#  パラメタ, 初期値
#
%direction=(
            '   N',    00.0,
            ' NNE',  22.5,
            '  NE',   45.0,
            ' ENE',  67.5,
            '   E',    90.0,
            ' ESE', 112.5,
            '  SE',  135.0,
            ' SSE', 157.5,
            '   S',   180.0,
            ' SSW', 202.5,
            '  SW',  225.0,
            ' WSW', 247.5,
            '   W',   270.0,
            ' WNW', 292.5,
            '  NW',  315.0,
            ' NNW', 337.5,
            '   C', -1,
            );
$winddtflag= 0;
$PLCID     = 0;
##################################
#
#  パラメタ, 初期値
#
while($line = <>){
#
#  空行
#
    if( $line =~ /^#/ ){
        next;
#
#  データ
#
    }elsif( $line =~ /(.*)日,([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*)$/){
        $hour=0;
        $date=$1;
        @data=($2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25);
        foreach $dataone ( @data ){
            $hour ++;
            printf("%s %s %4d %4d %2d %2d %2d %2d ", $PLACE, $KIND, $PLCID, $KNDID, $year, $month, $date, $hour);
            if( $winddflag == 1 ){
                printf("%6.1f\n", $direction{$dataone});
            }else{
                print $dataone,"\n";
            }
        }
#
#
#  年月
#
    }elsif( $line =~ /[^,]*,大気環境月報  ,平成[ ]*(.*)年[ ]*(.*)月.*/ ){
        $year  = $1;
        $month = $2;
#
#
#  地点・観測項目情報
#
    }elsif( $line =~ /[^,]*,測定場所,[ ]*\(([^,]*)\),([^ ,]*)[ ]*,項目,[ ]*\(([^,]*)\),([^, ]*)[ ]*,単位,.*/ ){
        $PLCID = $1;
        $PLACE = $2;
        $KNDID = $3;
        $KIND  = $4;
        if( $KIND =~ "^風向\$" ){
            $winddflag=1;
        }else{
            $winddflag=0;
        }
    }
}

[掲示板に戻る全部 次100 最新50
BluesBB-0.12 ©Sting_Band


WWW を検索 meteorology.jp を検索

Powered by XOOPS 2.0 © 2001-2006 The XOOPS Project, Maitained by A. Mori
FI Theme :: XOOPS 2 Theme by ImageSquare :: Costomized by matchan and A.Mori