2011-04-10
Excel用のCSV(SJIS)をPHP(UTF-8)で読み込む
Excelで作成したCSVファイルは文字コードがShift-JISであるため、UTF-8に設定してあるPHPで扱うには工夫が必要です。その取り扱い方について調べて、ベンチマークをとってみました。
CSVを配列にする関数4通り
テンポラリファイル作成してfgetcsv()
<?php function by_tmpfile($file) { $ret = array(); $buf = mb_convert_encoding(file_get_contents($file), 'utf-8', 'sjis-win'); $fp = tmpfile(); fwrite($fp, $buf); rewind($fp); while($line = fgetcsv($fp)) { $ret[] = $line; } fclose($fp); return $ret; }
ロケール設定してfgetcsv()
<?php setlocale(LC_ALL, 'ja_JP.SJIS'); function by_locale($file) { $ret = array(); $fp = fopen($file, 'r'); while ($line = fgetcsv($fp)) { mb_convert_variables('utf-8', 'sjis-win', $line); $ret[] = $line; } fclose($fp); return $ret; }
- setlocale()でOSのロケール設定を変更するとfgetcsv()で文字化けしない
- OSに’ja_JP.SJIS’のロケールが存在しない場合はlocaledefで作成する
- Windowsではsetlocale()の指定方法が異なるため注意
- 参考
str_getcsv()
<?php function by_str_getcsv($file) { $ret = array(); $buf = mb_convert_encoding(file_get_contents($file), 'utf-8', 'sjis-win'); $lines = str_getcsv($buf, "\r\n"); foreach ($lines as $line) { $ret[] = str_getcsv($line); } return $ret; }
- PHP5.3以上必要
- 行単位に分割してからstr_getcsv()を呼ぶ
- Excelのセル内改行はLFなため、CRLFの"\r\n"で分割可能
- 参考
<?php function by_str_getcsv_explode($file) { $ret = array(); $buf = mb_convert_encoding(file_get_contents($file), 'utf-8', 'sjis-win'); $lines = explode("\r\n", $buf); array_pop($lines); foreach ($lines as $line) { $ret[] = str_getcsv($line); } return $ret; }
- explode()版
- 末尾の改行で分割された行を無視するためarray_pop()している
ベンチマーク
環境
結果
| function | time | memory_peak_usage |
|---|---|---|
| by_tmpfile | 12.437s | 721848 |
| by_locale | 6.335s | 719456 |
| by_str_getcsv | 8.217s | 726208 |
| by_str_getcsv_explode | 5.405s | 726216 |
※平均値ではありませんが再試行しても微量な差です
まとめ
途中Twitterにてアドバイスいただきました@chobi_eさんありがとうございました!
関連記事
トラックバック - http://d.hatena.ne.jp/deeeki/20110410/excel_csv_php
リンク元
- 130 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCQQFjAA&url=http://d.hatena.ne.jp/deeeki/20110410/excel_csv_php&ei=u08hT9WQBcWOmQWV6plh&usg=AFQjCNHKrUsEQF8SCTXRuAyPQRy5DpxypQ&sig2=uVS2rgpgk6Xc43XfKz5KoQ
- 69 http://www.google.co.jp/url?sa=t&rct=j&q=php csv 読み込み 改行&source=web&cd=4&ved=0CD0QFjAD&url=http://d.hatena.ne.jp/deeeki/20110410/excel_csv_php&ei=KYymTqrRC46ZmQWekqTNDw&usg=AFQjCNHKrU
- 54 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CC0QFjAB&url=http://d.hatena.ne.jp/deeeki/20110410/excel_csv_php&ei=28oYT_zeC4v0mAW9y_CfCg&usg=AFQjCNHKrUsEQF8SCTXRuAyPQRy5DpxypQ&sig2=D_6n3b7310BkDWVQT-F30Q
- 52 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBkQFjAA&url=http://d.hatena.ne.jp/deeeki/20110410/excel_csv_php&rct=j&q=php テンポラリファイル 文??%9
- 36 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cts=1330673708038&ved=0CFgQFjAD&url=http://d.hatena.ne.jp/deeeki/20110410/excel_csv_php&ei=HnhQT9CfB6TNmAX15vz9BQ&usg=AFQjCNHKrUsEQF8SCTXRuAyPQRy5DpxypQ&sig2=abgzl09qjl5TnT9jm26Z
- 35 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=1&cts=1331476027200&ved=0CDIQFjAA&url=http://d.hatena.ne.jp/deeeki/20110410/excel_csv_php&ei=PbZcT-bYCoyUmQXlmsCSDw&usg=AFQjCNHKrUsEQF8SCTXRuAyPQRy5DpxypQ&sig2=ngSD5SED6s9xI7
- 26 http://www.google.co.jp/url?sa=t&rct=j&q=php+csv+読み込み+文字化け&source=web&cd=8&ved=0CGgQFjAH&url=http://d.hatena.ne.jp/deeeki/20110410/excel_csv_php&ei=Kp8WT9uaJIeJmQWT9oHAAw&usg=AFQj
- 25 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CEYQFjAC&url=http://d.hatena.ne.jp/deeeki/20110410/excel_csv_php&ei=PU8yT7iZLMfJmAXS7fXPBQ&usg=AFQjCNHKrUsEQF8SCTXRuAyPQRy5DpxypQ&sig2=exVvlg3WVOe99g8MSYytJA
- 24 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=7&cts=1331623452823&ved=0CH0QFjAG&url=http://d.hatena.ne.jp/deeeki/20110410/excel_csv_php&ei=EfZeT_DiGKGZiQfrhsnxBw&usg=AFQjCNHKrUsEQF8SCTXRuAyPQRy5DpxypQ
- 22 http://www.google.co.jp/




