PHPでのCSV読み込みは「SplFileObject::READ_CSV」で。あとCSV作成や編集はGoogleスプレッドシートがいい

更新日:

どうも。カッパです。

2019年現在、PHPでCSVファイルを読み込んで操作するベストプラクティスは間違いなく「SplFileObject」でしょう。ただしそれにはcsvファイルがUTF-8である必要があります(正確にはSshift_JISでも問題ないのですが理由は後述)。

CSV読み込みの基本的なコード

まずはCSV読み込みの基本的なコードです。


// CSVファイルのパス
$data = 'data.csv';
// CSVを読み込み
$file = new SplFileObject($data);
// CSV 列として行を読み込み
$file -> setFlags(SplFileObject::READ_CSV);
// 読み込んだSJISのデータをUTF-8に変換して保存
file_put_contents($filePath, mb_convert_encoding(file_get_contents($filePath), 'UTF-8', 'SJIS'));

$lineCount = 1;
foreach( $file as $line ) {
  // ヘッダー行をスキップ
  if( $lineCount > 1 ) {
    // 空行もスキップ
    if ( $empty( $line[0] ) ) {
      continue;
    }

  // 以下通常の処理
  $id = $line[0];
  $url = $line[1];
  $anchorTxt = $line[2];
}

これで基本的には動作します。

Shift_JISからは逃れられない!

上記のコードでは、特にShift_JIS対策をしていないので、csvのファイルで使われる文字コードがShift_JISだった場合、動きません。

Shift_JISにはダメ文字問題があったり、あまり関わりたくないものではあるのですが、クライアントやExcel大好き上司・同僚から渡されたファイルがShift_JISだった...。ということはよくある。

強い味方だGoogle スプレッドシート。Shift_JISでも安心

そこで、もらったCSVファイルをGoogle ドライブに放り込んでしまいましょう。そうするとGoogle スプレッドシートは勝手にUTF-8に変換してくれます。そのデータをUTF-8のCSVファイルとして書き出すことも可能です。

コードで対策することもできるのですが、できればShift_JISのCSVとは付き合いたくない、サーバーに置きたくないという思いから、いわゆるデータのクレンジングというやつを行うようにしています。

プログラマーらしくないといえばそうなんですけどね...。

  • B!