PHP:CSV-Klasse

In proc.gif
In Arbeit!
... weitere TODO-Listen

Beschreibung

Quellcode

<?php
/**
 * Created by PhpStorm.
 * User: alpha
 * Date: 15.09.18
 * Time: 23:44
 */

namespace cls;


/**
 * Diese Klasse führt folgende Aktionen aus:
 *
 *  - CSV-Datei lesen
 *
 */
class CSVReader
{

    /**
     * CSV-Quelle
     * @var string
     */
    private $source_file;

    /**
     * Maximale Länge der auszulesenden Zeile
     * 0 = unbegrenzt
     * @var int
     */
    private $file_row_length_max;

    /**
     * Trennzeichen zwischen den Datensätzen einer CSV
     * @var string
     */
    private $delimiter;

    /**
     * Umschließt einen Atomaren Datenteil in CSV
     * @var string
     */
    private $enclosure;

    /**
     * Datei-Ressource geöffneter CSV-Dateien im Lesemodus
     * @var resource
     */
    private $filehandle;

    /**
     * Fehlermeldungen
     * @var array
     */
    private $err_msg;

    /**
     * Cache für einen Record der gerade gelesen wurde
     * @var array
     */
    private $csv_record;

    /**
     * Kopfzeile einer CSV-Datei
     * @var array
     */
    private $csv_head;

    /**
     * @var array
     */
    private $csv_line;

    /**
     * zählt die ausgelesenen Zeilen
     * @var int
     */
    private $line_counter;

    /**
     * Explizide Codierung nach UTF-8
     * @var bool
     */
    private $utf_8;
    
    /**
     * @var string
     */
    private $md5;


    /**
     * CSVReader constructor.
     */
    public function __construct(){

        $this -> source_file           = '';
        $this -> file_row_length_max   = 0;
        $this -> delimiter             = ';';
        $this -> enclosure             = '"';
        $this -> utf_8                 = FALSE;

        $this -> set_std_parameter();

    }




    /**
     * @param $bool
     */
    public function set_utf_8( $bool ){

        $this -> utf_8 = ( $bool ) ? true : FALSE;

    }


    /**
     * Datei festlegen von der gelesen werden soll
     * 
     * @param $source_file
     */
    public function set_source_file( $source_file ){

        $this -> source_file = $source_file;

    }


    /**
     * Hauptfunktion zum lesen einzelner Datenzeilen aus der CSV-Datei
     * 
     * @return bool
     */
    public function read_cvs_record(){

        # prüfen ob die Ressource noch geöffnet ist
        if( is_resource( $this -> filehandle ) == false ){
            if( !$this -> open_file() ){
                return false;
            }
        }

        # liest einen Datensatz als Array aus
        return $this -> get_record();

    }


    /**
     * Vorlauf zum überspringen von 1 - n Zeilen
     *
     * @param int $lines
     *
     * @return bool
     */
    public function forward( $lines ){

        for( $i = 0 ; $i < $lines ; $i++ ){

            if( !$this -> read_cvs_record() ){
                return 
                    FALSE;
            }


        }

        return 
            TRUE;

    }


    /**
     * @return int
     */
    public function count_all_lines(){
        while ( $this -> read_cvs_record() ){}
        return $this -> line_counter;
    }


    /**
     * Rückgabe der aktuellen Datenzeile
     * 
     * @return array
     */
    public function get_csv_record(){

        # gibt den Datensatz zurück
        return $this -> csv_record;

    }


    /**
     * Assoziativ Rückgabe der aktuellen Datenzeile
     *
     * @return array
     */
    public function get_csv_line_assoc(){

        return
            array_combine(
                $this -> csv_head ,
                array_intersect_key( $this -> get_csv_record() , $this -> csv_head  )
            );

    }


    /**
     * Erzeugt aus dem aktuellen CSV-Record einen temprären CSV-Head im Objekt
     */
    public function set_csv_head_from_record(){

        $this -> csv_head = $this -> get_csv_record();

    }


    /**
     * holt aus der aktuell bearbeiteten Zeile einen Wert aus einer gewählten Spalte
     *
     * @param $col_name
     * @return string / atomares Daten-value einer CSV-Spalte
     */
    public function get_csv_col( $col_name ){

        $asCol = array_flip( $this -> csv_head );
        $this -> csv_line = $this -> get_csv_record();
        return $this -> csv_line[ $asCol[ $col_name ] ];

    }


    /**
     * Fehlermeldungen auslesen
     *
     * @return array
     *
     *
     */
    public function get_error_msg(){

        return $this -> err_msg;

    }


    /**
     * einzelnes Record aus Datei lesen
     * 
     * @return bool
     */
    private function get_record(){

        # Record lesen
        $this -> csv_record = fgetcsv(
            $this -> filehandle ,
            $this -> file_row_length_max,
            $this -> delimiter,
            $this -> enclosure
        );


        # UTF-8
        if( $this -> utf_8 === true ){
            $this -> csv_record = array_map( "utf8_encode" , $this -> csv_record );
        }


        # übergibt nur gültige Records
        if( is_array($this -> csv_record) ){
            $this -> line_counter++;
            return true;
        } else {
            unset($this -> csv_record);
            fclose( $this -> filehandle );
            return false;

        }

    }


    /**
     * Legt Standard-Parameter fest
     */
    private function set_std_parameter(){

        $this -> file_row_length_max = 0;
        $this -> delimiter = ';';
        $this -> enclosure = '"';

    }

    /**
     * Ausgabe der aktuellen Zeilenposition
     * @return int
     */
    public function get_line_count(){
        return $this -> line_counter;
    }


    /**
     * MD5 der CSV-Datei
     *
     * @return bool|string
     */
    public function get_md5(){

        if( $this -> md5 ){

            return
                $this -> md5;
        }

        if( $this -> chk() ){
            $this -> md5 = md5_file( $this -> source_file );

            return
                $this -> md5;
        }

        return
            FALSE;
        
    }


    /**
     * Existenz der Datei prüfen
     * Fehler loggen
     *
     * @return bool
     */
    private function csv_exists(){

        if( file_exists( $this -> source_file ) == FALSE ){
            $this -> err_msg[] = "Datei '{$this->source_file}' konnte nicht gefunden werden Zeile : " . __LINE__ . " in Datei " . __FILE__;
            return FALSE;
        }

        return TRUE;
    }


    /**
     * prüfen ob die CSV-Datei lesbar ist
     * Fehler loggen
     *
     * @return bool
     */
    private function csv_readable(){

        if( !is_readable( $this -> source_file ) ){
            $this -> err_msg[] = "Datei '{$this->source_file}' konnte nicht geöffnet werden Zeile : " . __LINE__ . " in Datei " . __FILE__;
            return FALSE;
        }

        return TRUE;

    }


    /**
     * Zusammengesetzte Dateiprüfung
     *
     * @return bool
     */
    private function chk(){

        if( !$this -> csv_exists() ){
            return FALSE;
        };

        if( !$this -> csv_readable() ){
            return FALSE;
        }

        return TRUE;

    }


    /**
     * Datei lesend öffnen
     *
     * @return bool
     */
    private function open_file(){

        if( !$this -> chk() ){
            return FALSE;
        }

        $this -> md5 = md5_file( $this -> source_file );
        $this -> filehandle  = fopen( $this -> source_file , "r" );
        #$this -> is_allowed_file_reopen = false;
        $this -> line_counter = 0;
        return true;

    }



}

Abfrage

$csv = new bipro_msc_cron_uebung_CSVService( "standard" , new bipro_msc_cron_Uebung_Logger() );

$csv -> set_source_file(PATH . "testdaten" . DS . "msc_depots_test.csv" );

#/*
$csv -> set_filter_intersect_cols([
    'Vermittlernr' ,
    'Kundennr' ,
    'Wertpapier_id' ,
    'Depotnr' ,
#    'Antragsnr' ,
    'Isin' ,
#    'Wertpapiername' ,
#    'Lagerstelle_id' ,
#    'Anlageart' ,
#    'Anlagesumme_soll' ,
#    'Bruttosumme (euro)' ,
#    'Anteile' ,
#    'Stand' ,
#    'Ausgabeaufschlag' ,
#    'Zahlrhythmus' ,
#    'Depotuebertrag' ,
#    'Erfassung' ,
#    'Status' ,
#    'Erstellungsdatum' ,
#    'Wert' ,
#    'Kursdatum' ,
#    'Nominal' ,
#    'Gesperrt' ,
#    'Lagerstelle' ,
#    'Wertpapiergruppe' ,
#    'Rkz' ,
#    'Wkn' ,
    'Datenmodell' ,
    'Rücknahmepreis' ,
    'Preis_datum' ,
#    'Wertpapierwährung' ,
    'Anteile abgeltungssteuerfrei' ,
    'Fremdanlage'
]);
#*/

$rows = $csv -> get_rows( 1 ,2, true , true );
print_r( $rows );

# speichert 3 Zeilen ab
$csv -> set_target_file(PATH . "testdaten" . DS . "msc_depots_temp.csv" );
$csv -> target_open_newfile();
$csv -> target_save_lines( $rows );
$csv -> target_close();


#/*
$csv -> source_open();
# speichert 3 weitere Zeilen ab
$csv -> set_target_file(PATH . "testdaten" . DS . "msc_depots_temp2.csv" );
$csv -> target_open_newfile();
$csv -> target_save_one_line( $csv -> get_row() );
$csv -> target_save_one_line( $csv -> get_row() );
$csv -> target_save_one_line( $csv -> get_row() );
$csv -> target_close();


$csv -> source_close();
#*/

#$datenanzahl = $csv -> get_all_rows_counter();
#print_r( $datenanzahl );

#var_dump( $csv -> get_all_rows_counter(true ,true ) );
#var_dump( $csv -> get_head_row() );
#var_dump( $csv -> get_head_row());
# TODO : Filter für Rückgaben
# TODO : Suchoptionen