Rubyで、LTSVファイルをライブラリを使わずハッシュに変換する時のメモ。

TL;DR

考慮が足りていないかもしれないが、サイズが小さい分にはこれで十分なはずです。

lines = File.readlines('file.ltsv')
lines.map(&:strip).map { |l| l.split("\t").each_with_object({}) { |t,h| k,v = t.split(':'); h[k] = v } }

ライブラリを使わずに変換する

LTSVのサイトでLTSVのABNFが載っています。

ltsv = *(record NL) [record]
record = [field *(TAB field)]
field = label ":" field-value
label = 1*lbyte
field-value = *fbyte

TAB = %x09
NL = [%x0D] %x0A
lbyte = %x30-39 / %x41-5A / %x61-7A / "_" / "." / "-" ;; [0-9A-Za-z_.-]
fbyte = %x01-08 / %x0B / %x0C / %x0E-FF

ABNFを読むと、

  • ltsvは、recordと改行によって構成される
  • recordは、fieldとタブ文字によって構成される
  • fieldは、label:、そしてfield-valueで構成される

というシンプルな規則で構成されており、これを順に実行すれば良いだけです。

最後に

LTSVは非常にシンプルなフォーマットです。 そのためライブラリを利用せずとも、比較的容易にパースできるのが良いですし、Labeledであるため途中からの拡張にも強いです。 もし、ライブラリを使って変換するのであれば、LTSVのサイトで紹介されているライブラリを使うのが良さそうですね。