桜上水在住のフリーのプログラマ/システムエンジニアの徒然なる日記風テキスト
app/models/datasources/csv_source.php
var $csv = array(
'datasource' => 'csv',
'path' => '..\tmp\csv', // local path on the server(windows)
'extension' => 'csv', // file extension of CSV Files
'readonly' => true, // only for reading
'recursive' => false, // only false is supported at the moment
);
linuxで使用する場合はpathの\を/に変更の事。
configファイルなので DS が使えない。。。
app/config/database.php内に記述した通り、
app/tmp/csv/
以下にcsvファイルを設置。
ファイル名は
例えば Userモデル の場合は users.csv など、
Cakephpのモデル→テーブル名の規則に準じるファイル名にする。
使用するmodel.phpファイルに
var $useDbConfig = 'csv';
の1行を追加
1行目がカラム名になるので使用したいカラム名を記述
2行目以降を実データとする。
csvファイルの文字コードはmb_internal_encoding()と一致するものが望ましいが、
Excel的にShift-JISも扱いたいところ。
その際はcsv_datasouce.php内のread()関数で
// Daten werden aus der Datei in ein Array $data gelesen
while ( ($data = fgetcsv ($this->handle[$model->table], 8192, $this->delimiter)) !== FALSE ) {
if ($lineCount == 0) {
の部分でdata(array)の各要素$valueに
mb_convert_encoding($value, mb_internal_encoding(), 'UTF-8,SJIS')
してやれば良いかと。
※今回の案件ではcsvアップローダでModel用csvをアップロードする際にUTF-8に変換掛けてるので使用しませんでした。
後は$usesに使用したいModel突っ込んで、
$this->Model->find('all')なりその他のmethodで呼んでやるだけです。
Cake記法でデータ取得出来るので直感的にコードが書けてうまうまでした。
オレオレcsvにはもう戻れませんw
兎にも角にも、PHP勉強会@関東で@kaz_29さんがDataSourceについての発表を行ってくれなければ使用しなかったと思います。
また、複数Modelが使用出来ずに困っていたつぶやき@Twitterを拾って、即修正版を上げて下さいまして、大変助かりました。
大変感謝しております。
csv使うPHP案件があったらガンガン使おう!
というわけで備忘録のまとめとさせて頂きます。
-
-