どうも。カッパです。
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とは付き合いたくない、サーバーに置きたくないという思いから、いわゆるデータのクレンジングというやつを行うようにしています。
プログラマーらしくないといえばそうなんですけどね...。