ディレクトリ内にある最新のCSVファイルを読み込む。PHP初心者日記!
データベースを使わずに、WEB系の知識のない人でもデータを更新できるようにCSVなどのファイルからデータを取得したい。
そして、
できればファイル名の指定をせずに、ディレクトリ内にある最新のCSVファイルからデータを読み取りたい。
今回このような場面に出くわしたのでググってみたところ、需要はたくさんありそうなのに一つもヒットしなかったため、PHPの初心者なりに一生懸命考えて記述しました!出来た時はめちゃくちゃ嬉しかった。。
忘れた時のメモ帳の意味も込めてご紹介したいと思います!
ディレクトリの構造
今回は、PHPファイルと同じディレクトリ内にあるCSVというフォルダから、
フォルダ内にいくつかあるCSVファイルのうち、更新日時が最新のものを読み込みます!
単純に1月から3月までの日付と曜日が入力してあるExcelで作った単純なファイルを3つ用意しました!
PHPの記述
まだまだPHP勉強したての初心者なので、必要のない記述だったり間違っている記述があるかもしれませんがご了承ください。
※ 2017年2月5日、一部記述を修正しました。
<?php $dirName = 'csv';//ディレクトリが存在するか if(! is_dir($dirName)) { die( 'ディレクトリが存在しません' ); } $fileArray = scandir($dirName);//ディレクトリの中身を取得 //h() htmlspecialchars用の関数を別に作っておく $fileArray = h($fileArray);//中身を消毒 $fileDate = array();//CSVファイル取得のための配列 /*----- ディレクトリ内のCSVファイルを取得 ------*/ foreach($fileArray as $fileContent){ $fileName = $dirName.'/'.$fileContent; $pathinfo = pathinfo($fileName,PATHINFO_EXTENSION);//拡張子のみ取得 if($pathinfo === 'csv')//拡張子がCSVだったら { $fileDate[] = $fileName;//配列に入れる } } if(count($fileDate) === 0) { die('CSVファイルが存在しません'); } /*CSVファイルの更新日時を取得*/ $timer = 0;//時間比較用の変数 foreach ($fileDate as $newFile) { $timeDate = date( 'Y-m-d H:i:s' ,filemtime($newFile));//ファイルの更新日時を取得 if($timeDate > $timer) { $newCsv = $newFile;//最新のCSVファイル $timer = $timeDate;//最新の更新日時 } } $csvFile = $newCsv; /*---- CSV取得用のお決まりの記述 -----*/ $tempCsv = file_get_contents($csvFile); $tempCsv = mb_convert_encoding($tempCsv,'UTF-8','CP932'); $fp = tmpfile(); fwrite($fp,$tempCsv); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); $ymdDate = array();//CSVファイルの年月日項目取得用の配列 $wDate = array();//CSVファイルの曜日取得用の配列 while($dateArray = fgetcsv($fp)){ list($ymd,$w) = $dateArray; $ymdDate[] = $ymd; $wDate[] = $w; } print_r($ymdDate); print_r($wDate); ?>
fgetCSV($fp)で取得したCSVのデータは二次元配列になっている為、普通にforeachなどを使っただけでは取得できませんでしたので、whileとlist()を使ってまとめて変数に代入。
あらかじめ配列用に作っておいた変数$ymdDateと$wDateにそれぞれ代入することによって、後から使いやすいように配列にデータを格納しておく。
今回は年月日と曜日の2項目だけでしたが、
CSVファイルのデータの項目数に合わせて、list()内に変数名を増やせばいくつでも取得することができます。
これを表示してみると、このような感じになります!
以上、
ディレクトリ内の最新のCSVファイルを読み取る方法でした!
今回、こちらの本にだいぶ助けられました!