YacsvがとうとうCSVインポートだけでなくCSVエクスポートにも対応しました!

Yacsvは、拙作のYet AnatherなCSVプラグインです。(使い方はこちら)

今まで数々のプロジェクトの「CSVインポート機能」で活躍してきました。個人的にはFilebinderの次によくできたと思っているプラグインです。

機能を追加するプラグインよりも、面倒な機能を簡単に実装できる(省略できる)プラグインが好きです。

CSVエクスポート機能

本当によくある「CSVインポート機能」。そのCSVインポート機能の実装でYacsvは使われてきました。

結構なパターンのCSVに対応しており、テストもあり、CIも回っていて、安心して実装できています。

一方で、CSVインポートより頻度は少ないながらもよくある機能が「CSVエクスポート機能」です。

こちらは、CSVをControllerでechoしたり、ViewでレンダリングしたりHelper使ったり、いろんな方法で実装してきましたが、どれも「まあ普通」でした。

「あ、そうだ。YacsvのCSVエクスポート実装をつくろう」

ということで、CakePHP3がでる直前のこのタイミングでつくっちゃいました。

Yacsv.CsvGenerator

同じYacsvなので、当然Yacsv.ImporterBehaviorと同じ感覚で使えることを目指しています。

以下のような感じで、配列地獄(?)なModel::find('all')の返り値にいい感じ対応してCSVを生成できるようになっています。

<?php
App::uses('CsvGenerator', 'Yacsv.Lib');
$posts = $this->Post->find('all');

$fields = array(
  'Post.body',
  'Post.title',
  'Post.created',
);

$options = array(
  'csvEncoding' => 'UTF-8',
  'delimiter' => ',',
  'enclosure' => '"',
  'newlineChar' => "\n",
  'forceEnclose' => true,
  'forceOutput' => false,
);

$csvString = CsvGenerator::generate($posts, $fields, $options);

内部エンジンはこれまた拙作のGinqCsvを利用しているので、$options のパラメータもGinqCsvのそれと同じです。

実は、GinqCsvの $options のパラメータがYacsv.ImpoterBehaviorを参考にしているので、結果としてYacsv.CsvGeneratorはYacsv.ImporterBehaviorと似ている感覚でCSV出力が可能。というわけです。

CSVのヘッダを設定したいときは $fields を配列ではなく、以下のよう連想配列で設定するだけです。 (これを思いついたから作ったと言っても過言ではない)

<?php
$fields = array(
  '内容' => 'Post.body',
  'タイトル' => 'Post.title',
  '投稿日時' => 'Post.created',
);

その他の使い方は、是非テストケースを見てみてください。

というわけで

CSV操作(インポート/エクスポート)はYacsvプラグインがおすすめです!