忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/05/27 03:47 |
WEBZARU 「PHPでCSVデータを読み込む(文字化け対策ver)」 の感想
http://www.webzaru.net/php/1365/
なんか色々ともやもやする。
一番気に入らないのは$id=1を指定しても全行読み込むところですが、他にも引数$idによって返り値が違うとか、全く意味のないforがあるとか、$_enc_toをループ内で毎回呼び出してるとか、if()の後に{}が無いとか色々とびみょい。
ということで書き直した。

class GetCsv{

    /**
     * CSVの全行を取得する
     *
     * @param  String ファイル名
     * @return array  fgetcsvの配列
     */
    public static function getCsvData( $filename, $id = false ){
        if($id && is_int($id)){
            return self::getCsvLine($filename, $id);
        }
        if ( !file_exists( $filename ) ){ return false;}

        $rows = array();
        $_enc_to   = mb_internal_encoding();
        $_enc_from = 'sjis';

        $handle = fopen( $filename, 'r' );

        self::fgetcsv_reg( $handle );
        while ( ( $data = self::fgetcsv_reg( $handle ) ) !== false ) {
            $rows[] = $data;
        }
        mb_convert_variables( $_enc_to, $_enc_from, $rows );

        fclose( $handle );
        return $rows;
    }

    /**
     * CSVの特定行を取得する
     *
     * @param  String ファイル名
     * @param  int    取得する行
     * @return array  fgetcsv
     */
    public static function getCsvLine( $filename, $id ){
        if ( !file_exists( $filename ) ){ return false;}
        $_enc_to   = mb_internal_encoding();
        $_enc_from = 'sjis';
        $handle = fopen( $filename, 'r' );

        for($loop=0; $loop<$id; $loop++){
            if(!self::fgetcsv_reg($handle)){
                return false;
            }
        }

        $row = self::fgetcsv_reg($handle);
        mb_convert_variables( $_enc_to, $_enc_from, $row );

        fclose( $handle );
        return $row;
    }
}

書き直してはみたもののやはり微妙だ。
メソッドがキャメルケースなのに内部変数がスネークケースのせい?
FROMエンコーディングがファイルを確認せずにSJIS固定のせい?
特定行取得はメソッドに織り込んでるのに範囲取得はarray_sliceとかやってるせい?

いや、そもそもニュースとかCSVじゃなくてDBで管理しろってところだ。


ちなみにfgetcsv_regは有名なのですが、そのまま使うとUndefined variable: eofのNoticeが出ます。
頭に$eof = false;とか突っ込んでおきましょう。

PR


2013/04/10 00:00 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP5.4.4 SplFixedArrayで固定長配列 | HOME | Zend Framework2.1.3 Zend\Stdlib\ArrayUtils>>
忍者ブログ[PR]