Mathematica 7でImportおよびExportを拡張する

MathematicaではImportExportを使って様々な形式のファイルを読み書きできるが、 標準で対応していないファイル形式についても自分でローダやライタを作り、 それをImportExportに対応させる方法が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]で自前のローダmyImportImportに登録
  • ImportExport`RegisterExport["ファイルフォーマット名", myExport]で自前のライタmyExportExportに登録

という使い方をするようだ。ファイルフォーマット名は"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, magicTrueまたはFalseで指定するがbin以外の意味はよく分らない。 extは上の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フレームワークのドキュメントが整備された。