PHP5のfgetcsvで文字化けするときの対応策 fgetcsv_reg を少し変えてみた

PHP5でfgetcsvを使用すると文字化けしたり正常に読み込めない場合の対応策として fgetcsv_reg というユーザー定義関数 ( PHP5でfgetcsvが正常に動作しない : ::yossy.blog:: )
がありますが、大量にcsvファイルを読み込んでると結構遅くなるので若干変えてみました。

殆ど同じですが$lengthの初期値1024にしてtrim(), empty()使わなかったりfeof()でファイル終端か判断してるぐらいで、気持ち早いかなって程度です。

※いい加減なので場合によっては遅くなるかもしれません。

<?php
function fgetcsv_reg( &$handle, $length = 1024, $delimiter = ',', $enclosure = '"' ) {

    $delimiter = preg_quote( $delimiter );
    $enclosure = preg_quote( $enclosure );

    $buffer = '';

    while ( !feof( $handle ) ) {
        $buffer .= fgets( $handle, $length );
        if ( preg_match_all( '/' . $enclosure . '/', $buffer, $m ) % 2 == 0 ) {
            break;
        }
    }

    $pattern = '/(' . $enclosure . '[^' . $enclosure . ']*(?:' . $enclosure . $enclosure . '[^' . $enclosure . ']*)*' . $enclosure . '|[^' . $delimiter . ']*)' . $delimiter . '/';

    $values = array();
    $len = preg_match_all( $pattern, preg_replace( '/[rn]+$/', '', $buffer ) . $delimiter, $matches );
    for ( $i = 0; $i < $len; $i++ ) {
        $values[] = str_replace( $enclosure . $enclosure, $enclosure, preg_replace( '/^' . $enclosure . '(.*)' . $enclosure . '$/s', "$1", $matches[1][$i] ) );
    }
    return $buffer ? $values : false;

}
?>

コメントを残す

メールアドレスが公開されることはありません。