CsvParser.php 2.94 KB
<?php
/**
 * Created by PhpStorm.
 * User: Cibermag
 * Date: 26.08.2015
 * Time: 17:00
 */

namespace app\components\parsers;

use Yii;
use yii\base\ErrorException;

class CsvParser implements \IteratorAggregate {


    /** @var bool */
    private $hasHeaderRow;

    /** @var resource */
    private $file;

    /** @var out encoding charset */
    private $out_charset = 'UTF-8';
    /** @var out encoding charset */
    private $in_charset;
    /** @var out encoding charset */
    private $first_line;




//    public function encodeFile( $in_charset, $out_charset, $filePath ){
//
//        $old_content = file_get_contents( $filePath );
//        $encode_content = iconv( $in_charset, $out_charset, $old_content );
//        $file = @fopen( $filePath, "w" );
//        fwrite( $file, $encode_content );
//        @fclose( $file );
//
//    }


    /**
     * @param string $delimiter
     * @param string $enclosure
     * @param string $escape
     * @return $this
     */
    public function setup( $file, $first_line = 1, $hasHeaderRow = TRUE, $delimiter = ';')
    {

        $this->file = $file;

        $this->file->setCsvControl($delimiter);
        $this->file->setFlags(\SplFileObject::READ_CSV);
        $this->file->seek( $this->first_line );

        $this->first_line = $first_line;
        $this->in_charset = 'windows-1251';
        $this->hasHeaderRow = $hasHeaderRow;
    }

    public function getIterator()
    {
        return new \ArrayIterator($this->read());
    }

    /**
     * @return array
     * @throws InvalidFileException
     * @deprecated Use ::read instead.
     */
    public function parseAll()
    {
        return $this->read();
    }

    /**
     * @return array
     * @throws InvalidFileException
     */
    public function read()
    {
        $return = [];

        $line = 0;
        $keys = NULL;

        while (($row = $this->readRow()) !== FALSE) {
            $line++;

            if ($this->hasHeaderRow) {
                if ($keys === NULL) {
                    $keys = array_values($row);
                } else {

                    if (count($keys) !== count($row)) {
//
                        Yii::warning("Invalid columns detected on line #$line .");
                        return $return;
                    }

                    $return[] = array_combine($keys, $row);
                }
            } else {
                $return[] = $row;
            }
        }

        $this->closeHandler();

        return $return;
    }


    private function closeHandler()
    {
        $this->file = NULL;
    }

    private function readRow()
    {
        $dirt_value_arr = $this->file->fgetcsv(  );
        $encode_arr = $this->encodeArray( $dirt_value_arr );

        return $encode_arr;

    }

    private function encodeArray( $array_to_encode )
    {
        return array_map(function($array_to_encode) {
            return iconv( $this->in_charset, $this->out_charset, $array_to_encode );
        }, $array_to_encode);

    }


}