複数行テキストデータをひとまとめにするフォーマット
テキスト処理プログラムのメンテナンス性の高いテスト方法について考えていた。そういうプログラムのテストは次のパターンが多い。
入力[複数行テキスト]→処理→出力[複数行テキスト]
そういうテストをたくさん書いてひとつのファイルにまとめると、見通しがよくないので困る。RubyやPerlならヒアドキュメントがあるからマシだが、インデントが乱れてカッコ悪い。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"]
このフォーマットの能力は、たんに複数のテキストをまとめるだけ。XMLやYAMLのように構造化もへったくれもない。たんなる文字列1次元配列のいち表現にすぎない。だがテストデータをこのフォーマットでまとめてしまえば、テストの管理は楽になるだろう。さて、このフォーマットになんて名前つけようか…
名前つけたらいろんな言語でのparser(笑)を書くとしよう。
SimpleTextArrayかTextArrayFormatか…