CSVファイルを解析して配列にする。
これが意外と簡単に出来なかったのでメモ。

よくexplode()を使ったサンプルがあるけど、値にカンマがある場合にダメなので注意。

今回は下記のようにカンマやダブルコーテーションが含まれている場合もしっかり対応します。

csv

あああ,“いい,いい”,“うう""うう”

↓ゴール

php

$data[0] = 'あああ';
$data[1] = 'いい,いい';
$data[2] = 'うう"うう';

PHP5.3以上の場合

まず、5.3以降であれば下記のように簡単に書けるっぽい。(動作は未確認)

php5.3〜

$file = new SplFileObject($csv_file_path);
foreach ($file as $line) {
    $line = mb_convert_encoding($line, 'UTF-8', 'sjis-win');
    $data[] = str_getcsv($line);
}

PHP5.2の場合

今回の本題、今後は下記のようにしようと思います。

php5.2

if (($fp = fopen($csv_file_path, "r")) === FALSE) {
    //TODO:エラー処理
}


// CSVの中身がダブルクオーテーションで囲われていない場合に一文字目が化けるのを回避
setlocale(LC_ALL, 'ja_JP');

$i=0;
while (($csv_data = fgetcsv($fp)) !== FALSE) {
    mb_convert_variables('UTF-8', 'sjis-win', $csv_data);
    if($i == 0){
        // タイトル行
        $header = $csv_data;
        $i++;
        continue;
    }

    $data[] = $csv_data;
    
    $i++;
}

fclose($fp);

メモ

setlocale(LC_ALL, ‘ja_JP’);

CSVファイルの値がダブルコーテーションで囲まれていない場合に
一文字目が文字化けする問題があったため下記URLを参考に対応。
http://happyparasol.com/?p=544

ほんとは
setlocale(LC_ALL, ‘ja_JP.Shift_JIS’);
にしたかったのだけど、サーバが対応されておらず設定できなかった。
下記コマンドで確認可能。

>locale -a | grep ja
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc

Tags: ,

Updated: