fgetcsvの履歴

PHPCSV読み込む関数。

ロケールによって文字コードの処理の仕方が違う

setlocale(LC_ALL, 'ja_JP.UTF-8');

とすればOK

WindowsではできたけどUnixでは動かない場合や、日本語だけうまく入らない場合はロケールが間違ってる可能性がある。


これをやっても全角英字や「~」が文字化けする!!
使うな、との声多数なのでもうこの関数は信用しない!というわけで自作した。

<?php
/**
 * @package   Mindia
 * @author    Akiyoshi Tanaka <akiyoshi@mindia.jp>
 * @copyright Mindia
 */
class Mindia_Csv{
    private $data = array();
    private $separator = ",";

    function toArray(){
        return $this->data;
    }
    
    function parse($string){
        $len = mb_strlen($string);
        $row = array();
        $col = ""; 
        $quoted = false;
        $prev = "";
        for ($i = 0; $i < $len; $i++){
            $char = mb_substr($string, $i, 1);
            if ($char === "\n" && !$quoted){
                $row[] = $col;
                $this->data[] = $row;
                $row = array();
                $col = "";
            }else if ($char === "\r"){
            }else if ($char === $this->separator && !$quoted){
                $row[] = $col;
                $col = "";
            }else if ($char === '"'){
                if ($prev === $char){
                    // escape quote
                    $col .= '"';
                }else{
                    if ($quoted){
                        // end quote
                        $quoted = false;
                    }else{
                        // start quote
                        $quoted = true;
                    }
                }
            }else{
                $col .= $char;
            }
            // to detect escape quote
            $prev = $char;
        }
        if (!empty($row) || $col !== ""){
            $row[] = $col;
            $this->data[] = $row;
        }
    }
}