123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- <?php
- require_once(dirname(__FILE__).'/DbController.php');
- require_once(dirname(__FILE__).'/IqdParserController.php');
- require_once(dirname(__FILE__).'/../models/CsvConfig.php');
- class CsvController
- {
- /** @var DbController */
- private $db;
- private $conf;
- /** @var CsvConfig */
- 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) . "')";
- }
- /**
- * @param PDOStatement $query
- * @param string $column
- * @return string
- */
- 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;
- }
- }
|