PHPでCSVファイルの読み込みから編集や書き出しをする
SqlFileObject を使って、CSVファイルの読み込みから編集、書き出しの方法を紹介します。
読み込みだけなら
// CSV読み込み
$input = file_get_contents('sample.csv');
// Shift-JISからUTF-8へ変換
$input = mb_convert_encoding($input, 'UTF-8', 'SJIS-win');
// 一時ファイルにUTF-8エンコードされたCSVを書き込む
$tmp = tmpfile();
$meta = stream_get_meta_data($tmp);
fwrite($tmp, $input);
// 一時ファイルから読み込み
$csv = new SplFileObject($meta['uri']);
// CSVとしてファイルを読み込ませる
$csv->setFlags(SplFileObject::READ_CSV);
foreach ($csv as $row)
{
// 1行ごとのデータ
var_dump($row);
}
// ファイル閉じる
$csv = null;
今回、自分が用意したCSVファイルがExcelで作成されたファイルのため、文字エンコーディングがShift-JISとなっています。しかし、SplFileObject ではUTF-8で扱うため、文字エンコーディングをはじめに変換しています。
編集と書き出しも
// CSV読み込み
$input = file_get_contents('sample.csv');
// Shift-JISからUTF-8へ変換
$input = mb_convert_encoding($input, 'UTF-8', 'SJIS-win');
// 一時ファイルにUTF-8エンコードされたCSVを書き込む
$tmp = tmpfile();
$meta = stream_get_meta_data($tmp);
fwrite($tmp, $input);
// 一時ファイルから読み込み
$csv = new SplFileObject($meta['uri']);
// CSVとしてファイルを読み込ませる
$csv->setFlags(SplFileObject::READ_CSV);
// 書き出し用のCSVファイル
$output = new SplFileObject('sample_output.csv', 'w');
foreach ($csv as $i => $row)
{
// 空行でない場合
if ($row[0])
{
// 1行目以降のセルを書き換える
if ($i !== 0)
{
// 2列目のセルを書き換える
$row[1] = '書き換えテスト';
}
// 行を書き出し
$output->fputcsv($row);
}
}
// CSV読み込み
$output = file_get_contents('sample_output.csv');
// UTF-8からShift-JISへ変換
$output = mb_convert_encoding($output, 'SJIS-win', 'UTF-8');
file_put_contents('sample_output.csv', $output);
// ファイル閉じる
$csv = null;
$output = null;