fields = array(); } /** * PHP5 magic method ;-) */ function __get( $key ) { return $this->fields[$key]; } /** * PHP5 magic method ;-) */ function __set( $key, $value ) { set( $key, $value ); } /** * Convenience method. */ function set( $key, $value ) { $this->fields[$key] = $value; } } class CsvFileParser { var $delimiter; // Field delimiter var $enclosure; // Field enclosure character var $inputEncoding; // Input character encoding var $outputEncoding; // Output character encoding var $data; // CSV data as 2D array var $columns; // Holds column names var $mode; // See the CSV_*_MODE defines /** * Constructor */ function CsvFileParser() { $this->delimiter = ","; $this->enclosure = '"'; $this->inputEncoding = "ISO-8859-1"; $this->outputEncoding = "ISO-8859-1"; $this->data = array(); $this->columns = array(); $this->mode = CSV_ARRAY_MODE; } /** * Cleans column names according to the selected output mode. */ function SetColumnNames($row) { for ($i = 0; $i < count($row); $i++) { $label = $row[$i]; if ($this->mode == CSV_OBJECT_MODE) { $label = preg_replace('/[^a-z0-9_]/i', '', $label); if (preg_match('/^[0-9]/', $label)) $label = '_'.$label; } if ($label == '') $label = 'col'.$i; $this->columns[$i] = $label; } } /** * Creates a hash from a row of values. */ function CreateHash($row) { $item = array(); for ($i = 0; $i < count($row); $i++) { if (!isset($this->columns[$i])) continue; $item[$this->columns[$i]] = $row[$i]; } return $item; } /** * Creates a CsvItemWrapper object from a row of values. */ function CreateObject($row) { $item = new CsvItemWrapper(); for ($i = 0; $i < count($row); $i++) { if (!isset($this->columns[$i])) continue; $item->set($this->columns[$i], $row[$i]); } return $item; } /** * Parse CSV from file * @param content The CSV filename * @param hasBOM Using BOM or not * @return Success or not */ function ParseFromFile( $filename, $hasBOM = false ) { if ( !is_readable($filename) ) { // echo "not readable"; return false; } return $this->ParseFromString( file_get_contents($filename), $hasBOM ); } /** * Parse CSV from string * @param content The CSV string * @param hasBOM Using BOM or not * @return Success or not */ function ParseFromString( $content, $hasBOM = false ) { $content = iconv($this->inputEncoding, $this->outputEncoding, $content ); $content = str_replace( "\r\n", "\n", $content ); $content = str_replace( "\r", "\n", $content ); $content = trim($content, "\n"); // Remove empty lines // Remove the BOM (first 3 bytes) if ( $hasBOM ) { $content = substr( $content, 3 ); } // Make sure it always end with a newline if ( $content[strlen($content)-1] != "\n" ) { $content .= "\n"; } // Parse the content character by character $row = array( "" ); $idx = 0; $quoted = false; $headerFound = false; for ( $i = 0; $i < strlen($content); $i++ ) { $ch = $content[$i]; if ( $ch == $this->enclosure ) { $quoted = !$quoted; } // End of line if ( $ch == "\n" && !$quoted ) { // Remove enclosure delimiters for ( $k = 0; $k < count($row); $k++ ) { if ( $row[$k] != "" && $row[$k][0] == $this->enclosure ) { $row[$k] = substr( $row[$k], 1, strlen($row[$k]) - 2 ); } $row[$k] = str_replace( str_repeat($this->enclosure, 2), $this->enclosure, $row[$k] ); } if ($this->mode != CSV_ARRAY_MODE && !$headerFound) { // Setup column names $this->SetColumnNames($row); $headerFound = true; } else { // Append row into table if ($this->mode == CSV_ARRAY_MODE) { $this->data[] = $row; } else if ($this->mode == CSV_HASH_MODE) { $this->data[] = $this->CreateHash($row); } else if ($this->mode == CSV_OBJECT_MODE) { $this->data[] = $this->CreateObject($row); } } $row = array( "" ); $idx = 0; } // End of field else if ( $ch == $this->delimiter && !$quoted ) { $row[++$idx] = ""; } // Inside the field else { $row[$idx] .= $ch; } } return true; } } //////// TEST /* $filename = 'data.csv'; $parser = new CsvFileParser(); $parser->delimiter = ";"; $parser->enclosure = ''; $parser->inputEncoding = 'UTF-8'; $parser->outputEncoding = 'UTF-8'; echo "

PHP CvsFileParser v. 1.0



Array Mode (default):
"; $parser->ParseFromFile($filename, true); print_r($parser->data); echo "

Object Mode:
"; $parser->mode = CSV_OBJECT_MODE; $parser->ParseFromFile('../osdab_data/data.csv', true); print_r($parser->data); echo "

Hash Mode:
"; $parser->mode = CSV_HASH_MODE; $parser->ParseFromFile('../osdab_data/data.csv', true); print_r($parser->data); */ ////////////// ?>