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のサイトで紹介されているライブラリを使った方が絶対に良いです.