テストに使うデータを以下のURLよりダウンロードして,プログラム作成用のディレクトリの下に新しいディレクトリを作って格納しておく.
http://richard.js.yamanashi.ac.jp/~toyoki/lectures/bwp/local_info/elecPower201312.zip
これらを読み込んで,表にしたり,平均値や合計を計算したりしてみよう.
<?php $dir = "./elecPower/"; $files = getDir($dir,".csv"); sort($files); foreach($files as $f) { preg_match("/[0-9]+/",$f,$matches); //ファイル名から数字の部分を検索する → $matchesに検索された文字列が配列としてはいる $date = $matches[0]; // $matches[0]に年月が入っている. echo $date . "\n"; // テストのために出力してみる. } function getDir($dir_name,$extension) { $found_files = array(); //配列変数を用意する if(!is_dir($dir_name)) die("不正なディレクトリです."); $dir = opendir($dir_name); while($file = readdir($dir)) { if(preg_match("/".$extension . "$/",$file)) $found_files[] = $file; } return($found_files); }
(注)正規表現での文字列検索や置換はeregではなくpregを使うことが推奨されていますので,そちらを使いましょう.
http://www.php.net/manual/ja/refs.basic.text.php
問題2に対して次のような改良を加えなさい.
解答はe-Learningのページヘ提出してください.
https://moodle.yamanashi.ac.jp/2014/course/view.php?id=1650
問題3の解答例を示します。
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.01 traditional//en"> <!-- オンラインテスト1-3 (データの欠損に対応した例) --> <html> <head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> </head> <body> <?php $dir = "./elecPower/"; // $files = getDir($dir,".csv"); sort($files); echo "<table border='2'><tr><th></th>"; // for($i=1;$i<=24; $i++) { echo "<th>" . $i . "時</th>"; $usageByHour[$i] = 0; // $dataNum[$i] =0; // } echo "<th>合計</th></tr>"; // foreach($files as $f) { preg_match("/[0-9]+/",$f,$matches); $date = $matches[0]; $FP = fopen($dir . $f,"r"); $usage = array(); // echo "<tr><td>" . $date ."</td>"; while(!feof($FP)) { // データを記録 $line = trim(fgets($FP)); if($line == "") continue; $item = explode(",",$line); $usage[$item[0]] = $item[2]; } // $dailyUsage = 0; for($i=1;$i<=24;$i++) { echo "<td>"; if(isset($usage[$i])) { echo $usage[$i]; $dailyUsage += $usage[$i]; $usageByHour[$i] += $usage[$i]; $dataNum[$i]++; } echo "</td>"; } echo "<td>" . $dailyUsage . "</td></tr>"; } echo "<tr><td>平均</th>"; for($i=1; $i<=24; $i++) { $average = sprintf("%.2f", $usageByHour[$i]/$dataNum[$i]); echo "<td>" . $average ."</td>" ; } echo "</tr></table>"; function getDir($dir_name,$extension) { $found_files = array(); // if(!is_dir($dir_name)) die("不正なディレクトリです."); $dir = opendir($dir_name); while($file = readdir($dir)) { if(preg_match("/".$extension . "$/",$file)) $found_files[] = $file; } return($found_files); } ?> </body> </html>
以下も同じプログラムからの引用です。(2月18日夕方までは、表示ソフトの問題で、一部文字が欠損して表示されていましたが、今はOKになりました。)
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.01 traditional//en"> <!-- オンラインテスト1-3 (データの欠損に対応した例) --> <html> <head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> </head> <body> <?php $dir = "./elecPower/"; // データファイルの検出 $files = getDir($dir,".csv"); sort($files); echo "<table border='2'><tr><th></th>"; // 一行目の見出し for($i=1;$i<=24; $i++) { echo "<th>" . $i . "時</th>"; $usageByHour[$i] = 0; // 時刻ごとの値の累積 $dataNum[$i] =0; // データが存在する日にちの数 } echo "<th>合計</th></tr>"; // ファイルを1つずつ読み込んで処理 foreach($files as $f) { preg_match("/[0-9]+/",$f,$matches); $date = $matches[0]; $FP = fopen($dir . $f,"r"); $usage = array(); // 時刻ごとのデータを記憶する echo "<tr><td>" . $date ."</td>"; while(!feof($FP)) { // データを記録 $line = trim(fgets($FP)); if($line == "") continue; $item = explode(",",$line); $usage[$item[0]] = $item[2]; } // データセルの書き出しと記憶 $dailyUsage = 0; for($i=1;$i<=24;$i++) { echo "<td>"; if(isset($usage[$i])) { echo $usage[$i]; $dailyUsage += $usage[$i]; $usageByHour[$i] += $usage[$i]; $dataNum[$i]++; } echo "</td>"; } echo "<td>" . $dailyUsage . "</td></tr>"; } echo "<tr><td>平均</th>"; for($i=1; $i<=24; $i++) { $average = sprintf("%.2f", $usageByHour[$i]/$dataNum[$i]); echo "<td>" . $average ."</td>" ; } echo "</tr></table>"; function getDir($dir_name,$extension) { $found_files = array(); //配列変数を用意する if(!is_dir($dir_name)) die("不正なディレクトリです."); $dir = opendir($dir_name); while($file = readdir($dir)) { if(preg_match("/".$extension . "$/",$file)) $found_files[] = $file; } return($found_files); } ?> </body> </html>