LoginSignup
15
19

More than 5 years have passed since last update.

PHP5.2でCSVファイル取り込み

Posted at

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
15
19
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
19