PHP5.2でCSVファイル取り込み
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