複数行テキストデータをひとまとめにするフォーマット

テキスト処理プログラムのメンテナンス性の高いテスト方法について考えていた。そういうプログラムのテストは次のパターンが多い。

入力[複数行テキスト]→処理→出力[複数行テキスト]

そういうテストをたくさん書いてひとつのファイルにまとめると、見通しがよくないので困る。RubyPerlならヒアドキュメントがあるからマシだが、インデントが乱れてカッコ悪い。elispは悲惨そのもので文字列は""文字列しか使えず、エスケープがたくさん含まれてしまうと見るに堪えない。

そこで、次のような簡単なフォーマットを考えてみた。

==========
hoge1
hoge2
==========
foo1
foo2
foo3
==========
bar1
bar2

1行目はデリミタを指定。2行目以降はデリミタで区切られたテキストの集合。デリミタはデータに含まれないものを選ばないといけない。parseはとても簡単だ。Rubyならたった2行。

def parse(io)
  delimiter=Regexp.union(io.gets)
  io.read.split(delimiter)
end

さきほどの例をparseしてみると、次のようになる。

require 'stringio'
parse(StringIO.new(txt))        # => ["hoge1\nhoge2\n", "foo1\nfoo2\nfoo3\n", "bar1\nbar2\n"]

このフォーマットの能力は、たんに複数のテキストをまとめるだけ。XMLYAMLのように構造化もへったくれもない。たんなる文字列1次元配列のいち表現にすぎない。だがテストデータをこのフォーマットでまとめてしまえば、テストの管理は楽になるだろう。さて、このフォーマットになんて名前つけようか…
名前つけたらいろんな言語でのparser(笑)を書くとしよう。

SimpleTextArrayかTextArrayFormatか…