<?php
##
## mag@massl.de 2002
##
## CLASS to walk with filter through a csv-file
## Name of fields are defined in first row.
##
/* EXAMPLE
include_once("csvwalk.php");
$ccsv = new csvwalk();
if ($ccsv->open("../csvfiles/file.csv")) { # if is's a path, take the newest file of type
$ccsv->set_filter("Sachgebiet","^3\."); # further filters are "and" combined
while ($ccsv->next_row()) {
echo "<br>".$ccsv->showfield("Sachgebiet");
echo "<br>".$ccsv->showfield("Titel");
echo "<br>".$ccsv->showfield("ID");
echo "<br>".$ccsv->showfield("Beginn");
echo "<br>".$ccsv->showfield("Ende");
echo "<br>".$ccsv->showfield("Ort");
echo "<br>".$ccsv->showfield("Betreuer");
echo "<hr>";}
$ccsv->close();}
EXAMPLE END
*/
class csvwalk {
var $fp;
var $length;
var $delimiter="";
var $csvfile="";
var $fields=array();
var $filter=array();
var $arow=array();
var $irow=0;
var $end=false;
## -- Constructor
function csvwalk($deli=";",$len=65536) {
$this->length=$len;
$this->delimiter=$deli;}
## -- open
function open($path) {
if (is_dir($path)) {
$this->newest_file($path,"\.csv$");}
else {
$this->csvfile=$path;}
if ($this->fp=fopen($this->csvfile,"r")) {
$this->fields=array_flip(fgetcsv($this->fp,$this->length,$this->delimiter));
$this->arow=$this->fields;
return true;}
else {
return false;}}
## -- Looking for newest file of $type in $path
function newest_file($path,$type=".*") {
clearstatcache();
$path=ereg_replace("/$","",$path);
if ($handle=opendir($path)) {
$told=0;
while (false!==($file=readdir($handle))) {
if ($file!="." && $file!=".." && ereg($type,$file) && !is_dir($path."/".$file)) {
$tnew=filemtime($path."/".$file);
if ($tnew>$told) {
$told=$tnew;
$this->csvfile=$path."/".$file;}}}
closedir($handle);}}
## -- Set regex filter to field for reading
function set_filter($field,$regex) {
$this->filter[$field]=$regex;}
## -- check one row for filter conditions
function check_filter(&$row) {
foreach ($this->filter as $fld => $rex) {
$v=$this->fields[$fld];
if (!ereg($rex,$row[$v])) {
return false;}}
return true;}
## -- read next valid row
function next_row() {
$this->end=true;
while ($adat=fgetcsv($this->fp,$this->length,$this->delimiter)) {
if (count($adat) && $this->check_filter($adat)) {
$this->irow++;
$this->arow=$adat;
$this->end=false;
break;}}
return !$this->end;}
## -- read field value of row (see example)
function showfield($field) {
$v=$this->fields[$field];
return $this->arow[$v];}
## -- file-pointer to start of file; reset filter manually
function reset() {
$this->irow=0;
$this->arow=array();
rewind($this->fp);}
## -- finish!
function close() {
fclose ($this->fp);}
}
?> |