PHPでSJISのCSVファイルをUTF-8で楽に処理するサンプルコード

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
)

読んで頂いて有り難うございます!