PHP: Esportazione dati in CSV, un Tool indispensabile

19 Apr 2019 | M.A.D.R.

Esportiamo una tabella mysql in csv, un tool indispensabile in qualsiasi framework e/o portale.

Come avete intuito, oggi parliamo di un piccolo tool che permetterà di facilitarci la vita per l’esportazioni dei dati di una tabella (mysql e non solo) in csv, attraverso uno script custom che eseguirà nel migliore dei modi le nostre specifiche rischieste.

Precedentemente abbiamo già parlato di come si effettua una connessione al Database attraverso php.

Avvalorando la tesi del riuso del codice oggi ci appoggiamo esattamente a quella Libreria/Mini Framework custom per l’esecuzione della connessione e delle query.

Ipotizzando di aver letto, compreso e testato il funzionamento della libreria non ci resta che andare avanti sull’argomento di oggi, utilizzando un piccolo diagramma e scrivendolo in linguaggio naturale, il risultato dovrebbe essere un qualcosa di molto vicino a quanto descritto:

  • Connessione al DB
  • Esecuzione delle query
  • Recupero risultato query
  • Inizializzazione della nostra classe per esportazione in CSV
  • Aggiunta parametri
  • Eliminazione campi
  • Formattazione campi
  • Formattazione output
  • Recupero / Stampa file generato

Detto questo, abbiamo bisogno solo di definire alcuni importanti metodi per il corretto funzionamento della nostra Classe.

Partiamo dal costruttore

/**
	 * Utils_Estrazione constructor.
	 *
	 * @param array $resukt_query
	 * @param array $options Array associativo di opzioni CHIAVE COME NOME FUNZIONE
	 */
	public function __construct($resukt_query=[],$options=[]) {
		$this->result=$resukt_query;
		if(!empty($options)){
			foreach ($options as $k=>$v){
				if(method_exists($this,$k)){
					call_user_func([$this,$k],$v);
				}
			}
		}
	}

Questo è il “main" della nostra classe, ossia il costruttore, che come ben noto costruisce l’oggetto e ne amplia le funzionalità attraverso l’uso e la definizione di proprietà della classe stessa.

Analizziamo i due parametri, di cui uno opzionale:

  • Result_query
    • La nostra query la salviamo in una variabile, e dobbiamo necessariamente passarla al costruttore
  • Options
    • Array associativo di parametri, in questi andremo a definire le nostre proprietà valorizzandole

Abbiamo quindi una lista di opzioni da passare al nostro costruttore, e più precisamente

/**
	 * Campi da estrazione
	 * @var array
	 */
	private $fields=[];
	/**
	 * Numero massimo di zeri
	 * @var int
	 */
	private $max_zeros=4;
	/**
	 * Separatore tra stringhe
	 * @var string
	 */
	private $separatore=',';
	/**
	 * Quotes tra stringhe
	 * @var bool
	 */
	private $quotes=FALSE;
	/**
	 * Campi sui quali anteporre lo zero
	 * @var array
	 */
	private $zeros_cmp=[];
	/**
	 * Campi sui quali effettuare la conversione di date
	 * @var array
	 */
	private $date_cmp=[];
	/**
	 * Formato data per la conversione
	 * @var string
	 */
	private $date_format='d/m/Y H:i:s';
	/**
	 * Campi non necessari per la generazione del CSV
	 * @var array
	 */
	private $delete_cmp=[];
	/**
	 * Path e Nome del file
	 * @var string
	 */
	private $file='';
	/**
	 * Risultato query
	 * @var array
	 */
	public $result=[];
	/**
	 * Var temporanea per lavoro
	 * @var array
	 */
	private $temp_data=[];
	/**
	 * Stringa contenente il lavoro svolto
	 * @var string
	 */
	public $output='';

Queste sono le proprietà della Classe denominata “Utils_Estrazione".

Potremo quindi definire quali saranno i campi sui quali effettuare una conversione di date, normalizzare una stringa, convertire un int in string, definire il nostro separatore, definire l’uso dei quotes in tutti i campi etc.

Auguro a tutti una felice esportazione.

class Utils_Estrazione {

	/**
	 * Campi da estrazione
	 * @var array
	 */
	private $fields=[];
	/**
	 * Numero massimo di zeri
	 * @var int
	 */
	private $max_zeros=4;
	/**
	 * Separatore tra stringhe
	 * @var string
	 */
	private $separatore=',';
	/**
	 * Quotes tra stringhe
	 * @var bool
	 */
	private $quotes=FALSE;
	/**
	 * Campi sui quali anteporre lo zero
	 * @var array
	 */
	private $zeros_cmp=[];
	/**
	 * Campi sui quali effettuare la conversione di date
	 * @var array
	 */
	private $date_cmp=[];
	/**
	 * Formato data per la conversione
	 * @var string
	 */
	private $date_format='d/m/Y H:i:s';
	/**
	 * Campi non necessari per la generazione del CSV
	 * @var array
	 */
	private $delete_cmp=[];
	/**
	 * Path e Nome del file
	 * @var string
	 */
	private $file='';
	/**
	 * Risultato query
	 * @var array
	 */
	public $result=[];
	/**
	 * Var temporanea per lavoro
	 * @var array
	 */
	private $temp_data=[];
	/**
	 * Stringa contenente il lavoro svolto
	 * @var string
	 */
	public $output='';
	/**
	 * Utils_Estrazione constructor.
	 *
	 * @param array $resukt_query
	 * @param array $options Array associativo di opzioni CHIAVE COME NOME FUNZIONE
	 */
	public function __construct($resukt_query=[],$options=[]) {
		$this->result=$resukt_query;
		if(!empty($options)){
			foreach ($options as $k=>$v){
				if(method_exists($this,$k)){
					call_user_func([$this,$k],$v);
				}
			}
		}
	}

	public function init($file=''){
		($file=='')?$file=time().'.csv':null;
		$this->file=$file;
		$this->temp_data=$this->fields;
		$this->_create_string();
		foreach ($this->result as $k=>$v){
			$this->temp_data=$v;
			$this->make_option_array();
		}
		return $this;
	}
	public function _operation(){
		$this->output=[];
		foreach ($this->result as $k=>$v){
			$this->temp_data=$v;
			$f_=['_add_zeros','_convert_date','_delete_data'];
			foreach ($f_ as $items)call_user_func([$this,$items],[]);
			$this->output[]=$this->temp_data;
		}
		return $this;
	}
	/**
	 * Esegue operazione tramite funzioni, l'ordine può essere modfiicato
	 */
	private function make_option_array(){
		$f_=['_add_zeros','_convert_date','_delete_data','_create_string'];
		foreach ($f_ as $items)call_user_func([$this,$items],[]);
	}
	public function set_fields($array=[]){
		$this->fields=$array;
	}
	public function date_format($format='d/m/Y H:i:s'){
		$this->date_format=$format;
	}
	public function set_quotes($param=FALSE){
		$this->quotes=$param;
	}
	public function set_date_fields($array=[]){
		$this->date_cmp=$array;
	}
	public function set_zeros_fields($array=[]){
		$this->zeros_cmp=$array;
	}
	public function set_delete_fields($array=[]){
		$this->delete_cmp=$array;
	}
	public function set_separator($separatore=','){
		$this->separatore=$separatore;
	}
	public function set_number_zeros_string($max=4){
		$this->max_zeros=$max;
	}
	/**
	 * Funzione per salvare e/o stampare il risultato
	 * @param bool $output
	 * @param bool $save
	 */
	public function output($output=TRUE,$save=FALSE){
		if($output){
			echo $this->output;
		}
		if($save){
			file_put_contents($this->file,$this->output);
		}
	}
	/**
	 * Aggiunge gli zeri alle stringhe indicate
	 */
	private function _add_zeros(){
		if(!empty($this->zeros_cmp)){
			foreach ($this->zeros_cmp as $items){
				(isset($this->temp_data[$items]))?$this->temp_data[$items]=$this->make_zeros($this->temp_data[$items]):null;
			}
		}
	}
	/**
	 * Utils zeros
	 * @param $string
	 *
	 * @return string
	 */
	private function make_zeros($string){
		$str_='';
		$max=$this->max_zeros-strlen($string);
		for($i=0;$i<$max;$i++){
			$str_.='0';
		}
		$str_.=$string;
		return $str_;
	}
	/**
	 * Converte le date sui campi definiti, se non definiti non elabora nessun campo
	 */
	private function _convert_date(){
		if(!empty($this->date_cmp)){
			foreach ($this->date_cmp as $item){
				(isset($this->temp_data[$item]))?$this->temp_data[$item]=date($this->date_format,strtotime($this->temp_data[$item])):null;
			}
		}
	}
	/**
	 * Elimina eventualmente i campi non necesasri
	 */
	private function _delete_data(){
		if(!empty($this->delete_cmp)){
			foreach ($this->delete_cmp as $items){
				if(isset($this->temp_data[$items]))unset($this->temp_data[$items]);
			}
		}
	}
	/**
	 * Crea la stringa dalla variabile temporanea
	 */
	protected function _create_string(){
		foreach ($this->temp_data as $k=>$v){
			if($this->quotes)$this->output.='"'.$v.'"'.$this->separatore;
			else $this->output.=$v.$this->separatore;
		}
		$this->output.="\r\n";
		return $this;
	}
	
}

Soluzioni complete per ogni esigenza