fgetcsv の代替関数を作成したが、どうも件数が一致しない。
原因は、最後の改行から EOF までを1行として入力していたからだった。
入力長が 0 で EOF だったら EOF として false を返すように改良した。
// File Get CSV function fgetcsv( &$fh, $test = false ) { if ( feof( $fh ) ) return false ; $csv = '' ; while ( ! feof( $fh ) ) { $csv .= mb_convert_encoding( fgets( $fh ), 'UTF-8', 'SJIS-win' ) ; if ( ( ( preg_match_all( '/"/', $csv, $matches ) ) % 2 ) == 0 ) break ; } if ( ( $csv == '' ) and ( feof( $fh ) ) ) return false ; // <-- ここを追加 $values = array() ; $temp = preg_replace( '/(?:x0Dx0A|[x0Dx0A])?$/', ',', $csv, 1 ) ; preg_match_all( '/("[^"]*(?:""[^"]*)*"|[^,]*),/', $temp, $matches ) ; for ( $i = 0 ; $i < count( $matches[ 1 ] ) ; $i++ ) { if ( preg_match( '/^"(.*)"$/s', $matches[ 1 ][ $i ], $m ) ) { $matches[ 1 ][ $i ] = preg_replace( '/""/', '"', $m[ 1 ] ) ; } $values[] = $matches[ 1 ][ $i ] ; } return $values ; }
コードお借りします。ありがとうございます。
preg_match_allの正規表現は、最後の「,」に?が必要のようです。行末が”で終わる場合に分割に失敗してしまいます。
おかしいですね…
$temp = …
の所で行末は必ず ,(カンマ) のはずですが…
現在は正常に使用出来ていますし、以下のサイトを信用していますので、このままで大丈夫だと思います。
http://www.din.or.jp/~ohzaki/perl.htm#CSVwithCRLF
すみません。
mb_convert_encodingを勝手にコメントアウトして改行変換をスルーさせてました。
勘違いです、申し訳ありません