<?php
/**
* Short Desc
*
* A basic CSV parsing class that offers much the same functionality of the ADODB Class
*
* @package CsvReader
* @author Jonathan Nichols
* @version 1.0
* @copyright 2009-06-10
* @example csv.php
*/
class CsvReader {
/**#@+
* @access private
* @var string
*/
private $delimiter = ',';
private $file = null;
private $field_escape = null;
private $line_escape = PHP_EOL;
/**#@-*/
/**#@+
* @access private
* @var int
*/
private $row_pos = 0;
/**#@-*/
/**#@+
* @access private
* @var string
*/
private $row_array = array();
/**#@-*/
/**#@+
* @access protected
* @var string
*/
protected $filename;
/**#@-*/
/**#@+
* @access protected
* @var boolean
*/
protected $EOF = false;
protected $BOF = true;
/**#@-*/
/**#@+
* @access protected
* @var string
*/
protected $fields = array();
protected $headings = array();
/**#@-*/
/**#@+
* @access public
* @var boolean
*/
public $first_row_contains_headings = false;
/**#@-*/
/**#@+
* @access public
* @return boolean
*/
public function Execute($filename = null) {
if (isset($filename)) {
$this->filename = $filename;
$this->file = file($filename);
$this->checkfile();
$this->processfile();
return true;
}
return false;
}
/**#@-*/
/**#@+
* @access public
* @return boolean
*/
public function __construct($file = null, $first_row_contains_headings = false) {
$this->first_row_contains_headings = $first_row_contains_headings;
if (isset($file)) {
$this->Execute($file);
return true;
}
return false;
}
/**#@-*/
/**#@+
* @access public
* @return void
*/
public function __set($var = null, $val = null) {
if (!isset($var)) {return;}
$this->$var = $val;
}
/**#@-*/
/**#@+
* @access public
* @return mixed
*/
public function __get($var = null) {
if (!isset($var)) {return;}
return $this->$var;
}
/**#@-*/
/**#@+
* @access private
* @return void
*/
private function checkfile( $newline = null, $last_run = false ) {
if (!isset($newline)){$newline = "\r";}
if ( (sizeof($this->file) == 1) && ($this->file[0] != "") ) {
$this->file = split($newline, $this->file[0]);
$this->line_escape = $newline;
$this->checkfile("\n");
}
if ($last_run) {return;}
$this->checkfile("\r\n", true);
}
/**#@-*/
/**#@+
* @access private
* @return void
*/
private function SetRecordPointers() {
if ( ($this->row_pos == 0) && (sizeof($this->row_array) == 1) ) {
$this->EOF = true;
$this->BOF = true;
}
if ( ($this->row_pos == 0) && (sizeof($this->row_array) > 1) ) {
$this->EOF = false;
$this->BOF = true;
}
if ( ($this->row_pos != 0) && ($this->row_pos != sizeof($this->row_array) - 1) ) {
$this->EOF = false;
$this->BOF = false;
}
if ( ($this->row_pos != 0) && ($this->row_pos == sizeof($this->row_array) - 1) ) {
$this->EOF = true;
$this->BOF = false;
}
}
/**#@-*/
/**#@+
* @access public
* @return void
*/
public function SetDelimiter( $delim ) {
$this->delimiter = $delim;
}
/**#@-*/
/**#@+
* @access public
* @return void
*/
public function SetFieldEscape( $escape ) {
$this->field_escape = $escape;
}
/**#@-*/
/**#@+
* @access public
* @return void
*/
public function SetLineEscape( $escape ) {
$this->line_escape = $escape;
}
/**#@-*/
/**#@+
* @access public
* @return string
*/
public function GetDelimiter( $return = true ) {
if ($return) {return $this->delimiter;}
echo $this->delimiter;
}
/**#@-*/
/**#@+
* @access public
* @return string
*/
public function GetFieldEscape( $return = true ) {
if ($return) {return $this->field_escape;}
echo $this->field_escape;
}
/**#@-*/
/**#@+
* @access public
* @return string
*/
public function GetLineEscape( $return = true ) {
if ($return) {return $this->line_escape;}
echo $this->line_escape;
}
/**#@-*/
/**#@+
* @access public
* @return string
*/
public function GetFileName( $return = true ) {
if ($return) {return $this->filename;}
echo $this->filename;
}
/*
* @todo Create a functional metatype, understand more about testing for (int), (string), (float), etc.
*
*/
/*public function MetaType($var) {
return gettype($var);
}*/
/**#@+
* @access private
* @return void
*/
private function processfile() {
foreach($this->file as $row_key=>$row_data) {
$split_array = split($this->field_escape . $this->delimiter . $this->field_escape, $row_data);
if ( ($this->first_row_contains_headings) && ($row_key == 0) ) {
foreach($split_array as $cell_data) {
$this->headings[] = trim($cell_data);
}
} else {
$key = $row_key;
if ($this->first_row_contains_headings) {
$key = $row_key-1;
}
$this->row_array[$key] = array();
foreach($split_array as $cell_num=>$cell_data) {
$this->row_array[$key][] = trim($cell_data);
if ($this->first_row_contains_headings) {
$this->row_array[$key][$this->headings[$cell_num]] = trim($cell_data);
}
}
}
}
$this->fields = $this->row_array[$this->row_pos];
unset($this->file);
}
/**#@-*/
/**#@+
* @access public
* @return void
*/
public function MovePrevious() {
$this->row_pos--;
if ($this->row_pos == -1) {
$this->row_pos = 0;
$this->SetRecordPointers();
$this->fields = $this->row_array[$this->row_pos];
return;
}
$this->fields = $this->row_array[$this->row_pos];
$this->SetRecordPointers();
}
/**#@-*/
/**#@+
* @access public
* @return void
*/
public function MoveNext() {
$this->SetRecordPointers();
if ($this->EOF){return;}
$this->row_pos++;
$this->fields = $this->row_array[$this->row_pos];
}
/**#@-*/
/**#@+
* @access public
* @return void
*/
public function MoveFirst() {
$this->SetRecordPointers();
$this->row_pos = 0;
$this->fields = $this->row_array[$this->row_pos];
}
/**#@-*/
/**#@+
* @access public
* @return void
*/
public function MoveLast() {
$this->SetRecordPointers();
$this->row_pos = sizeof($this->row_array) - 1;
$this->fields = $this->row_array[$this->row_pos];
}
/**#@-*/
/**#@+
* @access public
* @return int
*/
public function RecordCount() {
return sizeof($this->row_array);
}
/**#@-*/
/**#@+
* @access public
* @return int
*/
public function FieldCount() {
return sizeof($this->fields);
}
/**#@-*/
/**#@+
* @access public
* @return string
*/
public function CreateSqlInsert($table = null, $use_fields = null, $exclude_fields = null) {
if (!isset($table)) {return false;}
$fields = "";
$values = "";
if ( (isset($use_fields)) && (is_array($use_fields)) ) {
foreach($use_fields as $field) {
$fields .= ", $field";
$values .= ", '{$this->fields[$field]}'";
}
} else {
if (!isset($use_fields)) {
if($this->first_row_contains_headings) {
foreach($this->headings as $key) {
$addfield = true;
if (isset($exclude_fields)) {
foreach($exclude_fields as $exfield) {
if ($exfield == $key) {
$addfield = false;
}
}
}
if ($addfield) {
$fields .= ", $key";
$values .= ", '{$this->fields[$key]}'";
}
}
} else {
foreach($this->fields as $key=>$val) {
$addfield = true;
if (isset($exclude_fields)) {
foreach($exclude_fields as $exfield) {
if ($exfield == $key) {
$addfield = false;
}
}
}
if ($addfield) {
$fields .= ", $key";
$values .= ", '{$this->fields[$key]}'";
}
}
}
}
}
return "INSERT INTO `$table` (" . ltrim($fields, ", ") . ") VALUES (" . ltrim($values, ", ") . ");";
}
/**#@-*/
}
?>
|