<?php

/**------------------------------------------------
*
* Rooty, 2018 <rooty@rooty.me>
*
*
* This software is protected by copyright, please
* read the file COPYRIGHT.
* This program is distributed in the hope that it
* will be useful, but without any warranty; without
* even the implied warranty of merchantability or
* fitness for a particular purpose. Please
* read the file LICENCE.
*
*Fichier csv.php
*
*Ce fichier contient la classe d'accès aux données de fichier CSV (Lecture et ecriture)
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2004/04/07
* @version 1.0
* @copyright Copyright &copy; 2004-2005, ARD Limousin
* @package system_data_source
* @subpackage file
*
*/

#####################################################################################################
################################# Parametrage
#####################################################################################################
/**
* declaration du system... si cette variable n'est pas définie, les fichier inclus ne marche pas...
* cette variable est déclarée sur la page d'execution du script.
*<p> if ( !defined('SYSTEM_IN') )
* {
* die("Hacking attempt");
* }</p>
*/
if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* classe CSV
*
* classe de gestion de Fichiers CSV
*
* @package system_data_source
* @subpackage file
*/
class CSV
{

/**#@+
* @access private
*/

/**
* @var chaine
* @desc Correspond au chemin local (serveur) de fichier a analyser
*/
var $filePath=Null;

/**
* @var pointeur
* @desc Flux ouvert par le fichier
*/
var $fileStream=Null;

/**
* @var chaine
* @desc Séparateur de champ : par default ";"
*/
var $separateur=";";

/**
* @var entier
* @desc Ligne courante dans le fichier
*/
var $currentRow=Null;

/**
* @var tableau
* @desc Ligne courante dans le fichier
*/
var $allRows=Null;

/**#@-*/

/**
*Constructeur
*
*<p>Ouverture et lecture d'un fichier CSV</p>
* @param chaine Chemin du fichier a ouvrir
* @param chaine Séparateur de champs : par default ";"
*/
function __construct($fichier, $separateur = ";")
{
	$this->filePath = $fichier;
	$this->separateur = $separateur;
	$this->fileStream = fopen($this->filePath,"r+");
}

/**
*Tri Ascendant par champ .
*
* Trier les enregistrements en fonction d'un champ
*
* @access public
* @param entier numero de champ (commence a 0)
* @return tableau  tableau résultat du tri
*/
function sortBy($champ)
{
	global $idcomp;
	$idcomp=$champ;

	function compare($a,$b)
	{
			global $idcomp;
			return strcmp($a[$idcomp],$b[$idcomp]);
	}

	$tab = $this->FetchallRows();
	usort($tab,"compare");
	return $tab;
}

/**
*lecture d'une ligne
*
* Permet la lecture d'une ligne du fichier . (utilisation similaire à mysql_fetch_row)
* et retourne sous forme de tableau les différents champs lus
*
* @access public
* @return tableau Contenu d'une ligne sous forme de tableau a indice numerique
*/
function fetchRow()
{
	$this->currentRow = ($this->fileStream != NULL) ? fgetcsv($this->fileStream,1000,$this->separateur) : null;
	return $this->currentRow;
}

/**
*Lecture Totale des champs
*
* lit la globalité des lignes du CSV et retourne un tableau bidimensionnel
*
* @access public
* @return tableau_2d Contenu d'une ligne sous forme de tableau a deux dimensions a indices numerique
*
*/
function fetchallRows()
{
	rewind($this->fileStream);
	$i=0;
	while ($this->currentRow = fgetcsv($this->fileStream,1000,$this->separateur))
	{
		$this->allRows[$i++] = $this->currentRow;
	}
	return $this->allRows;
}

/**
*Ajouter une Ligne
*
* Utilise des parametres dynamiques pour ajouter une ligne à la fin du fichier CSV.
*
* @access public
* @return booleen si la ligne a bien était ajoutée
*/
function addRow()
{
	fseek($this->fileStream,0,SEEK_END);
	$nbarg = func_num_args();
	$ligne = "\n";

	for ($i=0;$i<$nbarg;$i++)
	{
		$ligne.="\"".func_get_arg($i)."\"";

		if ($i != ($nbarg-1))
		{
			$ligne.=$this->separateur;
		}
	}
	$ligne.="\n";
	fputs($this->fileStream,$ligne);
	return true;
}

/**
*Fermer un fichier
*
* Fermeture de flux et désallocation des variables
* @access public
* @return booleen
*/
	function close()
	{
		fclose($this->fileStream);
		return true;
	}
}
?>
