脳みそスワップアウト

揮発性なもので。おもにPHPのこととか。

ExcelフレンドリなCSVをphpunit/dbunitで使う

phpunit/dbunitで、DBのテストデータをCSVで用意するのはよくやること。

いまどきのアプリなら当然 UTF-8
でも ExcelUTF-8 をまともに読み書きできない。

Excel よりも UTF-8 に強いツールはある事はあるのだけども、
やっぱり操作感は Excel には敵わないのよね。これがずっと難だった。

ところが、BOM付きでLEなUTF-16なら比較的自然に編集できることがわかった。
ダブルクリックやドラッグ&ドロップで開けるし、Ctrl+Sで保存できるのだ。

CSVUnicode文字を使う可能性のある場合、UTF-16(LE+BOM)が一番Excelフレンドリということだろう。
今後はこれでいこうと思う。


そこで、そんなExcelフレンドリなCSVphpunit/dbunitで扱うためのCsvDataSetを作った。
https://github.com/iamapen/dbunit-ExcelFriendlyDataSet


ついでにCSVの先頭列を無視できるような機能もつけた。
文字列のカラムがあるテーブルならまだしも、数値カラムだけで構成されたテストデータってあとで訳わからなくなりがちだし。

phpunitと連携しないとアサーションはできないけども、
dbunit単体でもテストデータの投入に使えて便利。


なお、各ツールで UTF-16 はこんな名前。
WindowsUnicodeと言ったら UTF-16LE な場合が多い。
BOMは保存ダイアログにチェックボックスがある。
Excel: Unicode
sakura: Unicode
秀丸: Unicode(UTF-16)
vim: utf16le
mbstring: UTF-16


それから、Excel(2003)のCSVのデフォルトの挙動は
・デリミタはTAB
・文字列はダブルクォートで囲む
・エスケープはダブルクォートを重ねる
となっていたので、これに合わせるのが最もExcelフレンドリになる。