| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 | 
							- <?php
 
- require_once(dirname(__FILE__).'/DbController.php');
 
- require_once(dirname(__FILE__).'/IqdParserController.php');
 
- require_once(dirname(__FILE__).'/../models/CsvConfig.php');
 
- class CsvController 
 
- {
 
- 	
 
- 	private $db;
 
- 	private $conf;
 
- 	
 
- 	private $csv;
 
- 	private $data;
 
- 	private $header;
 
- 	public function __construct($csvConfig = false)
 
- 	{
 
- 		$this->csv = ($csvConfig) ? $csvConfig : new CsvConfig();
 
- 		$this->conf = array("report" => "", "export_query" => "");
 
- 	}
 
-     public function csvExport()
 
- 	{
 
-         $res = $this->db->Query($this->conf['export_query']);
 
-         if ($this->db->Error($this->conf['export_query'])) return false;
 
-         $firstRow = $res->fetch(PDO::FETCH_ASSOC);
 
-         if (!$firstRow) return false;
 
-         $columns = array_keys($firstRow);
 
-         $this->columnDetails = array();
 
-         for ($i = 0; $i < count($firstRow); $i++) {
 
-             $$this->column_details[$columns[$i]] = $this->getColumnTypeFromQuery($res, $i);
 
-         }
 
-         $header = $this->db->getHeaderNames($this->conf['report'], $columns);
 
-     
 
-         $fwh = fopen($this->conf['filename'], "w");
 
-         fwrite($fwh, implode(';', $header)."\n");
 
-         fwrite($fwh, implode(';', $this->encodeRow($firstRow))."\n");
 
-     
 
-         while($row = $res->fetch(PDO::FETCH_ASSOC)) {
 
-             fwrite($fwh, implode(';', $this->encodeRow($row))."\n");
 
-         }
 
-         fclose($fwh);
 
-         return true;
 
-     }
 
- 	public function getHeader ()
 
- 	{
 
- 		if (!$this->header) {
 
- 			$firstRow = $this->getHeaderFromCsv();
 
- 			$this->header = ($this->csv->Header) ? $firstRow : $this->getArtificialHeader(count($firstRow));
 
- 		}
 
- 		return $this->header;
 
- 	}
 
- 	private function getRow ($handle)
 
- 	{
 
- 		$row = str_replace("\r\n", "", fgets($handle));
 
- 		return ($this->csv->Encoding == "ansi") ? mb_convert_encoding($row, "ISO-8859-1", "UTF-8") : $row;
 
- 	}
 
- 	public function getHeaderFromCsv ()
 
- 	{
 
- 		if (($handle = fopen($this->csv->Filename, "r")) === false) return false;
 
- 		$header = $this->getRow($handle);
 
- 		fclose($handle);
 
- 		return $this->getHeaderFromString($header);
 
- 	}
 
- 	public function getHeaderFromString ($rowString)
 
- 	{
 
- 		$row = explode($this->csv->Delimiter, $rowString);
 
- 		return array_map("IqdParserController::stringConvert", $row);
 
- 	}
 
- 	public function import ($callback = "CsvController::identity")
 
- 	{
 
- 		if (($handle = fopen($this->csv->Filename, "r")) === false) return false;
 
- 		if ($this->csv->Header) {
 
- 			$this->header = $this->getHeaderFromString($this->getRow($handle));
 
- 		}
 
- 		$result = array();
 
- 		while ($row = $this->getRow($handle)) {
 
- 			$result[] = call_user_func($callback, $this->decodeRow(explode($this->csv->Delimiter, $row)));
 
- 		}
 
- 		fclose($handle);
 
- 		return $result;
 
- 	}
 
- 	private static function identity ($var)
 
- 	{
 
- 		return $var;
 
- 	}
 
- 	private static function sqlInsert ($var)
 
- 	{
 
- 		return "('" . implode("','", $var) . "')";
 
- 	}
 
- 	
 
- 	private function getColumnTypeFromQuery($query, $column) {
 
- 		$meta = $query->getColumnMeta($column);
 
- 		return $meta['native_type'];
 
- 	}
 
-     public function convertArray ($tableArray)
 
-     {
 
-         $result = "";
 
-         foreach ($tableArray as $row)
 
-         {
 
-             $result .= $this->encodeRow($row);
 
-         }
 
-         return $result;
 
-     }    
 
- 	public function decodeRow ($row)
 
- 	{
 
- 		if (!$this->header) {
 
- 			$this->header = $this->getArtificialHeader(count($row));
 
- 		}
 
- 		$result = array_combine($this->header, array_fill(0, count($this->header), ''));
 
- 		foreach ($row as $i => $col) {
 
- 			$result[$this->header[$i]] = $this->decodeColumn($col);
 
- 		}
 
- 		return $result;
 
- 	}
 
- 	private function decodeColumn ($col)
 
- 	{
 
- 		$col = str_replace("\"", "", $col);
 
- 		$col = str_replace("'", "", $col);
 
- 		$col = trim($col);
 
- 		if (preg_match("/^\d+,\d+$/", $col)) {
 
- 			return str_replace(",", ".", $col);
 
- 		}
 
- 		if (preg_match("/^(\d{1,2})\.(\d{1,2})\.(\d{2,4})$/", $col, $m)) {
 
- 			return "{$m[3]}-{$m[2]}-{$m[1]}";
 
- 		}
 
- 		return $col;
 
- 	}
 
-     public function encodeRow ($row) {
 
- 		if (!$this->header) {
 
- 			$this->header = implode(";", array_keys($row));
 
- 			$this->data = array();
 
- 		}
 
-         $result = array();
 
-     
 
-         foreach ($row as $key => $value) 
 
-         {
 
-             $result[] = $this->encodeColumn($value);
 
-         }
 
-         $csv = implode(';', $result);
 
- 		$this->data[] = $csv;
 
- 		return $csv . "\r\n";
 
-     }
 
-     
 
-     private function encodeColumn ($col, $format = "VAR_STRING") {
 
-         switch ($format) {
 
-             case 'VAR_STRING':
 
-                 return trim($col);
 
-             case 'FLOAT':
 
-             case 'NEWDECIMAL':
 
-                 return number_format($col, 2, ",", "");
 
-             case 'DATE':
 
-                 return ($format == '0000-00-00') ? "" : $col;
 
-         }
 
-         return $col;
 
-     }
 
- 	public function exportToString ()
 
- 	{
 
- 		if ($this->csv->Header) {
 
- 			array_unshift($this->data, $this->header);
 
- 		}
 
- 		return implode("\r\n", $this->data);
 
- 	}
 
- 	private function getArtificialHeader ($count)
 
- 	{
 
- 		$result = array();
 
- 		for ($i = 1; $i <= $count; $i++) {
 
- 			$result[] = "col" . $i;
 
- 		}
 
- 		return $result;
 
- 	}
 
- }
 
 
  |