RubyでLTSVをHashに変換する

RubyでLTSV形式のファイルをライブラリを使わずにHashに変換する時のメモです.

TL;DR

細かいケースの考慮が足りていないかもしれませんが、以下で十分だと思います.

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

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

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で構成される

というシンプルな規則で構成されているため、
Rubyのコードでもこれに即するように定義すれば問題ありません.

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

最後に

LTSVは非常にシンプルなフォーマットかつ、JSONに変換しやすく拡張しやすいファイル形式です.
またライブラリを利用しなくても簡単にパースもできます.

今回は自前実装したんですが、自前実装する必要がなければLTSVのサイトで紹介されているライブラリを使った方が絶対に良いです.

ltsv.org