MENU

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;