巨大なCSVファイルからRSSを作成

htmlと並行して、CSVでデータを公開しているウェブサイトがあります。
1日2回わざわざ最新情報を追加してくれているので、直接アクセスすることも予定していると思います。


htmlからRSSを作成する場合、途中xmlに変換するとはいっても、自分で構造を分析する手間が加わります。そのため結構時間がかかります。しかしcsvなら分析不要!ラクチン!


しかしこのcsv、件数が2万件弱、ファイルサイズで8MB弱もあります。
こんなの正面からforeachで処理したら、メモリとか心配(共用サーバでやったら多分怒られる)


グーグル先生におうかがいをたててみました。


▽巨大なSJISCSVファイルをfgetcsv関数で処理する
 (hnwの日記)
 http://d.hatena.ne.jp/hnw/20090317



やっぱりfile_get_contentsはマズいみたいですが、fgetcsvという関数があるらしい。
使用するのはバッファ分のメモリだけ。素晴らしい!
なんでもありますね。素晴らしいぞ、PHP!


PHP:fgetcsv - Manual
 http://jp2.php.net/manual/ja/function.fgetcsv.php



しかし「csv ファイルの文字コードと、PHP の内部文字エンコーディングが違う場合、fgetcsv() で読み込むと、どうしても文字が腐る」のは大問題。
Excel対応のCSVファイルはShift JISだからこの問題に対応しなければいけません(私は、PHPを使う際UTF-8で統一)。


先のhnwさんがShift JISのCSVファイルを処理するコード例を示してくださっているのでこれを使います。
Stream_Filter_Mbstringが必要です。


▽Stream_Filter_Mbstring - openpear
 http://openpear.org/package/Stream_Filter_Mbstring


PHP:PHP 入出力ストリーム - Manual
 http://www.php.net/manual/ja/wrappers.php.php


フィルターがちゃんと理解できてないので、コメント欄の記載を生かすことができていません。
そのためコード例をそのまま使いました。
もう一度使う時にちゃんと考えてみたいです。


2009/07/29追記

肝心のRSSを作成する箇所について書いていませんが、ここで度々紹介しているHTMLScrapingのサンプルスクリプトHTMLToFeed.class.phpを使用しています。


HTMLToFeed.class.phpXML取得部分をfgetcsvに置き換えて処理するだけで、RSSが作成可能です。