
<?php
class csv_import {

	/*
	** NEDERLANDS **
	Met deze class kan en CSV worden geimporteerd en ingelezen.
	Ik heb deze class geschreven omdat de fgetcsv() functie van php quotes die niet ge-escaped zijn niet goed pakt, ook is deze class een stuk sneller
	
	Wanneer de class word word aangeroepen zijn er 3 variabelen die mee kunnen worden gegeven
		Eerste	:	De $_FILES array waar mee gewerkt moet worden
		Tweede	:	Wanneer de eerste regel gebruikt moet worden om de array genaamde keys moet hebben
		Derde	:	Waarmee de items worden gescheden, de quotes die worden gebruikt moeten worden meegeven
	
	** ENGLISH **
	With this class u can import a CSV and read it
	I wrote this class because the built-in fgetcsv() function from php doesnt work well with unescaped quote's and this class is a bit faster aswell
	
	When the class gets called there are 3 variables that can be given
	
		First		:	The $_FILES array that should be used
		Second	:	When the fist line of the CSV must be to give the retuning array named keys
		Third		:	The delimiter of the CSV, quotes that are used must olso be given
	
	Created by Sc0tTy on 05-12-2006
	Last modified on 05-12-2006
	www.SenS-Design.nl
	*/

	// --------------------------------------------------------------------
	// Variabelen vastzetten
	var $arr_handle = array();
	var $arr_csv = array();
	var $cur_line = 0;
	var $name_keys = FALSE;
	var $delimiter = "','";

	// --------------------------------------------------------------------
	// Classe starten en de settings goedzetten
	function csv_import( $csv = FALSE , $name_keys = FALSE , $delimiter = FALSE ) {
		
		// Kijken of er wel een csv bestand is gegeven
		if ( !$csv['tmp_name'] ) {
			$this->handle_error( 'Er is geen CSV bestand gegeven.' );
		}
		
		// Kijken of dit wel een csv bestand is
		$arr_types = array( 'application/vnd.ms-excel' , 'text/comma-separated-values' );
		if ( !in_array( $csv['type'] , $arr_types ) ) {
			$this->handle_error( 'Dit is geen CSV bestand.' );
		}
		
		// CSV openen
		$file = fopen( $csv['tmp_name'] , 'r' );
		if ( !$file ) {
			$this->handle_error( 'Het CSV bestand kon niet worden geopend.' );
		}
		
		// CSV inlezen
		while ( $handle = fread( $file , filesize( $csv['tmp_name'] ) ) ) {
			
			$arr_chars['search'] = array( "\n\r", "\r\n" , "\r" );
			$arr_chars['replac'] = array( "\n" , "\n" , "\n" );
			
			// Newline breaks goed zijn
			if ( strstr( "\r" , $handle ) ) {
				str_replace( $arr_chars['search'] , $arr_chars['replac'] , $handle );
			}
			
			// Regels exploden
			$handle = explode( "\n" , $handle );
			
			// Lijn in array zetten
			$this->arr_handle[] = $handle;
		}
		
		// De eerste regel van een csv 
		if ( is_array( $this->arr_handle[0] ) ) {
			$csv_keys = array_shift( $this->arr_handle[0] );
		} else {
			$csv_keys = array_shift( $this->arr_handle );
		}
		
		// Wanneer deze parameter TRUE is worden de namen in de eerste regel gebruikt om de keys te geven, de keys worden hier opgeslagen
		if ( $name_keys ) {
			$this->name_keys = $this->explode_line( $csv_keys );
		}
		
		// Door geimporteerde CSV lopen en deze in eigen arrays zetten
		foreach ( $this->arr_handle AS $line ) {
			if ( is_array( $line ) ) {
				foreach ( $line AS $row ) {
					$this->arr_csv[] = $this->explode_line( $row );
				}
			} else {
				$this->arr_csv[] = $this->explode_line( $line );
			}
		}
		
		// Laaste regel is leeg deze kan worden verwijdert
		array_pop( $this->arr_csv );
		
		if ( $delimiter ) {
			$this->delimiter = $delimiter;
		}
		
		// Bestand sluiten
		fclose( $file );
	}
	
	// --------------------------------------------------------------------
	// Explode de regel
	function explode_line( $line ) {

		// Quotes escapen
		if ( strstr( $line , '","' ) ) {
			str_replace( '"' , '\"' , $line );
			str_replace( '\",\"' , '","' , $line );	
			$this->delimiter = '","';
		}
		
		$line = chop( $line );
		
		// Eerste en laatste quote weghalen
		$line = substr( $line , 1 , -1 );
		
		// Exploden
		$line = explode( $this->delimiter , $line );
		
		// Wanneer deze parameter TRUE is worden de namen in de eerste regel gebruikt om de keys te geven, hier worden de keys verrandert
		if ( $this->name_keys ) {
			foreach ( $line AS $key => $value ) {
				$tmp[ $this->name_keys[ $key ] ] = $value;
			}
			$line = $tmp;
		}
		
		return $line;
	}
	
	// --------------------------------------------------------------------
	// Leest door array en returned huidige regel
	function read_line() {
		
		// Kijken of de array nog wel bestaat
		if ( $this->arr_csv == NULL ) {
			return FALSE;
		}
		
		// Kijken of de lijn wel bestaat zo niet geheugen vrijgeven en afsluiten
		if ( !$this->arr_csv[ $this->cur_line ] ) {
			$this->csv_close();
			return FALSE;
		}
		
		// Huidige lijn verhogen
		$this->cur_line++;
		return $this->arr_csv[ $this->cur_line-1 ];
	}
	
	// --------------------------------------------------------------------
	// Wanneer er een error is moet deze correct worden weergegeven
	function handle_error( $error ) {
		die( 'CLASS :: csv_import :: ERROR :: ' . $error );
	}
	
	// --------------------------------------------------------------------
	// Wanneer de class klaar is alle variabelen leegmaken
	function csv_close() {
		$this->arr_handle = NULL;
		$this->arr_csv = NULL;
		$this->cur_line = NULL;
	}
}
?>
 