PHPでCSV(SJIS)を読み込んで、データをUTF-8にして処理する方法です。
CSVの文字コード処理って意外と面倒だったりしますよね。
このサンプルコードは、CSV(SJIS)ファイルからデータベースにUTF-8として保存したい時などに役に立ちます。
Good!
このサンプルコードは、元のCSVファイルはSJISのままで残しておけます。サンプルコード
(PHP 4, PHP 5, PHP 7)
// localeを設定 setlocale(LC_ALL, 'ja_JP.UTF-8'); // SJISのCSVファイル $filename = 'data.csv'; // ファイルを開く $data = file_get_contents($filename); // ユニークな一時ファイル作成する $fp = tmpfile(); // 文字コード変換して一時ファイルに書き込む fwrite($fp, mb_convert_encoding($data, 'UTF-8', 'SJIS-win')); // ポインタを先頭に fseek($fp, 0); // UTF-8のCSVデータを1行ずつ処理する while ($line = fgetcsv($fp)) { // 配列 print_r($line); } // close(一時ファイルも削除される) fclose($fp);
簡単な説明
CSVファイルをSJISとして開き、$dataに代入する。
$dataをUTF-8に変換してから、ユニークな一時ファイルにCSVデータをまるごと書き込みます。
それを1行ずつ処理して使います。
この方法は、SJISのCSVファイルをループで1行ずつ文字コード処理するより、はるかに効率的です。
一時ファイルのファイル名などを取得したい場合
一時ファイルがどこに保存されるのか知りたい場合にどうぞ。
// ユニークな一時ファイル作成する $fp = tmpfile(); $meta = stream_get_meta_data($fp); print_r($meta); // 取得例 Array ( [timed_out] => [blocked] => 1 [eof] => [wrapper_type] => plainfile [stream_type] => STDIO [mode] => r+b [unread_bytes] => 0 [seekable] => 1 [uri] => /tmp/phpUY4iRO )