【CodeIgniter】CSVファイルパーサーライブラリ

CodeIgniter3を使っている方はLeague/CSVを利用することをおすすめします。

http://a-zumi.net/www/codeigniter3-league-csv/

以下、本文です。

CodeIgniter用のCSVファイルパーサーライブラリを作りました。

CSVファイルパーサーライブラリ

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class CsvParser
{
    private $handle;
    private $file;
    private $parse_header;
    private $length;
    private $delimiter;
    private $enclosure;
    
    public $header;
    
    public function __construct()
    {
        setlocale(LC_ALL, 'ja_JP.UTF-8');
    }

    public function __destruct()
    {
        if(is_resource($this->handle))
        {
            fclose($this->handle);
        }
    }
    
    public function load($file, $parse_header = FALSE, $length = 50000, $delimiter = ',', $enclosure = '"')
    {
        $this->file         = $file;
        $this->parse_header = $parse_header; 
        $this->length       = $length; 
        $this->delimiter    = $delimiter; 
        $this->enclosure    = $enclosure;
        
        if(!file_exists($this->file)){
            throw new Exception(sprintf("%sが存在しません。", basename($this->file)));
        }
        
        if(($file = file_get_contents($this->file)) === FALSE){
            throw new Exception(sprintf("%sを読み込めません。", basename($this->file)));
        }else{
            //テンポラリファイルを作成
            $this->handle = tmpfile();
            // 文字コード変換
            $file = mb_convert_encoding($file, mb_internal_encoding(), mb_detect_encoding($file, 'UTF-8, EUC-JP, JIS, eucjp-win, sjis-win'));
            // バイナリセーフなファイル書き込み処理
            fwrite($this->handle, $file);
            // ファイルポインタの位置を先頭へ
            rewind($this->handle);
        }
        
        if ($this->parse_header) {
            $this->header = fgetcsv($this->handle, $this->length, $this->delimiter, $this->enclosure);
            $this->header = array_map(function($header){
                return preg_replace('/\n|\r/', '', $header);
            }, $this->header);
        }
    }

    public function parse()
    {
        if(!$this->handle){
            throw new Exception(sprintf("%s", "ファイルが読み込まれていません。"));
        }
        
        $data = array();

        while( ($row = fgetcsv($this->handle, $this->length, $this->delimiter, $this->enclosure)) !== FALSE )
        {
            if($this->header)
            {
                foreach($this->header as $i => $heading_i)
                {
                    if(isset($row[$i])){
                        $line[$heading_i] = $row[$i];                       
                    }else{
                        throw new Exception(sprintf('%s', "ファイルが不正です。"));
                    }

                }
                $data[] = $line;
            }
            else
            {
                $data[] = $row;
            }
        }
        
        fclose($this->handle);
        
        return $data;
    }
}

ファイル名をcsvparser.phpとして、application/libraries内に設置して下さい。

CSVファイルパーサーライブラリの使い方

コントローラーのメソッド内に以下のようにライブラリを読み込みます。

$this->load->library('csvparser');

次にCSVファイルを読み込みます。

$this->csvparser->load('file.csv');

最後にCSVファイルをパースします。

$csv_data = $this->csvparser->parse();

以上です。

一行目が項目名の場合は以下のようにCSVファイルを読み込んで下さい。

$this->csvparser->load('file.csv', TRUE);

 

お気軽にコメントをどうぞ

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください