ヘッダ行つきCSV(とかTSV)を簡単に扱うライブラリを作った

Excelにて元データを作って、その元データを使って色々するツールをよく書くのだけども
ExcelVBAはめんどいし、かといってrubyを使ってExcelデータを扱うのもめんどい。


よくやるのはシートをコピーしてメモ帳に貼り付けてTSVにしてからrubyに食わせる方法だけども
各行をsplit(/\t/)で分割するだけだと、どの列にどのデータが入っているのかがよくわからなくなる。


そこでscsv(Simple CSV)というライブラリを作ってみた。

インストール

gem install gemcutter
gem install scsv

基本の使い方

a.csv

名前,フリガナ,性別
佐藤,サトウ,男
田中,タナカ,女

a.rb

require "scsv"

SCSV.parse("a.csv") do |row|
  p row
end
#=> {"名前" => "佐藤", "フリガナ" => "サトウ", "性別" => "男"}
#=> {"名前" => "田中", "フリガナ" => "タナカ", "性別" => "女"}

p SCSV.parse("a.csv")
#=> [{"名前" => "佐藤", "フリガナ" => "サトウ", "性別" => "男"}, {"名前" => "田中", "フリガナ" => "タナカ", "性別" => "女"}]

オプション

SCSV.parseメソッドにはオプションを渡せます。

:header ヘッダを指定します。
  • true ... ファイルの1行目をヘッダとみなします。
  • 配列 ... その配列をヘッダとみなします。
  • false ... ヘッダを使用しません。(ハッシュではなく、配列を返します)

デフォルトはtrueです。

SCSV.parse("a.txt", {:header => ["a", "b", "c"]})
#=> [{"a" => "名前", "b" => "フリガナ", "c" => "性別"}, {"a" => "佐藤", "b" => "サトウ", "c" => "男"}, {"a" => "田中", "b" => "タナカ", "c" => "女"}]

SCSV.parse("a.txt", {:header => false})
#=> [["名前", "フリガナ", "性別"], ["佐藤", "サトウ", "男"], ["田中", "タナカ", "女"]]
:col_sep 列の区切り文字を指定します。


デフォルトは","です。


デフォルトが"\t"であるSTSVクラスも使えます。
むしろExcel使い的にはSTSVクラスのほうが使用頻度が高いかと。


a.tsv

名前\tフリガナ\t性別
佐藤\tサトウ\t男
田中\tタナカ\t女

a.rb

require "scsv"

STSV.parse("a.tsv") do |row|
  p row
end
#=> {"名前" => "佐藤", "フリガナ" => "サトウ", "性別" => "男"}
#=> {"名前" => "田中", "フリガナ" => "タナカ", "性別" => "女"}

p STSV.parse("a.tsv")
#=> [{"名前" => "佐藤", "フリガナ" => "サトウ", "性別" => "男"}, {"名前" => "田中", "フリガナ" => "タナカ", "性別" => "女"}]

制限事項など

クオートは考慮しません。