Mathematica 7でImportおよびExportを拡張する
MathematicaではImport
やExport
を使って様々な形式のファイルを読み書きできるが、
標準で対応していないファイル形式についても自分でローダやライタを作り、
それをImport
やExport
に対応させる方法がExtending Import & Export (Wolfram Library Archive)において解説されている。
しかしこの文書は2003年のもので以前はExperimental`RegisterConverter
という関数で登録すればよかったのだが、
この関数はMathematica 7にはない。
Names["*`*Register*"]
などとして探し回ったところ、
ImportExport`RegisterFormat
ImportExport`RegisterExport
ImportExport`RegisterImport
というそれらしいものを見つけた。
早速
ClearAttributes[ImportExport`RegisterFormat, ReadProtected]
として読込みプロテクトを解除してどういう動作をするのか調べたところ、
ImportExport`RegisterFormat["ファイルフォーマット名"]
としてファイルフォーマットを登録ImportExport`RegisterImport["ファイルフォーマット名", myImport]
で自前のローダmyImport
をImport
に登録ImportExport`RegisterExport["ファイルフォーマット名", myExport]
で自前のライタmyExport
をExport
に登録
という使い方をするようだ。ファイルフォーマット名は"GPX"でも"KML"でも"JSON"でも好きな名前を付けていい。
myImportやmyExportの書式は以前と変わっていないようで、
myImport[filename_String, options___?OptionQ] := Module[{...},...]
myExport[filename_String, expression_, options___?OptionQ] := Module[{...},...]
でいい模様。
ImportExport`RegisterFormat
には以下のオプションがある。
BinaryFormat
: バイナリファイルならTrue
、そうでなければFalse
。ImportExport`Encoding
: よくわからないが、標準では"BASE64"、“BZIP2”、“GZIP”、“UUE"だけでTrueになっている。ImportExport`Extensions
: 対応する拡張子またはそのリスト。{"*.nb","*.html"}
などと指定する。AlphaChannel
: アルファチャンネルを使う画像かどうか?Exportの際のラスタライズに関係するかも。JPEG2000やPNGなどでTrueになっている。
ただ、ImportExport`Extensions
に拡張子を指定して登録しても、Export
では大丈夫だがImport
ではうまく判別されない。
ImportExport`RegisterImport
の動作についてもう少し調べる必要がある。
Wolfram Researchが新しいドキュメントを出してくれれば早いのだけれど…。
Feb. 20 2010追記
Importで自動判別させる方法が判明。
FileFormatDump`AddFormat["ファイルフォーマット名", bin, bundle, archive, encoding, magic, ext, mime, test, bundletestfunc]
として、判別するときに用いられる関数のほか、MIMEタイプも登録できる模様。
bin
(バイナリ形式か否か), bundle
, archive
, encoding
, magic
はTrue
またはFalse
で指定するがbin
以外の意味はよく分らない。
ex
tは上のExtensions
と同様に{"*.nb","*.html"}
などの様式で指定し、mime
にはMIMEタイプのリストを{"APPLICATION/XHTML+XML","TEXT/XML"}
のように指定する。
test
にはファイル形式を判別する関数またはNone
を指定する。たとえばXHTMLでは
StringMatchQ[#1, ___ ~~
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML" ~~ __,
IgnoreCase -> False] &
となっている。
bundletestfunc
は地理データ系の形式で拡張子が指定されているが、意味不明。
とりあえずは空のリスト({}
)でいいと思われる。
Aug. 27 2012追記
Mathematica 8からはImport/Exportフレームワークのドキュメントが整備された。