Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | CSV Table/Row/Field でCSVを操作

概要

CSV Table/Row/Field でCSVを操作

詳細

CSV Table/Row/Field でCSVを操作してみます

Table

TableはDBの表をイメージするとよい。
Rowの配列を保持している。

Row

RowはDBの行をイメージするとよい。
Fieldの配列を保持している。
Row[ヘッダー名のシンボル]の形式でカラムの値を取得出来る。

Field

FieldはDBのカラムをイメージすると良い。
Fieldは要素2の配列で、最初の要素にヘッダー・次の要素に実際の値を保持している。

サンプルコード
# encoding: utf-8
require 'csv'
require 'tbpgr_utils'

table = CSV.table "sample.csv"

bulk_puts_eval binding, <<-EOS
table.class
table.headers
EOS

table.each do |row|
  bulk_puts_eval binding, <<-EOS
row
row.class
row[:header1]
row[:header2]
row[:header3]
  EOS
end

table.each do |row|
  row.each do |field|
    bulk_puts_eval binding, <<-EOS
field.first
field.last
    EOS
  end
end

__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval

https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
読み込みCSV

※あえて、カラムが改行やカンマを保持しているCSVを利用

header1,header2,header3
"column1_1","column1_2","column1_3"
"column2_1","column2_2
multi line data","column2_3"
"column3_1","column3_2","column3_3 , contain comma"
出力
table.class # => CSV::Table
table.headers # => [:header1, :header2, :header3]
row # => #<CSV::Row header1:"column1_1" header2:"column1_2" header3:"column1_3">
row.class # => CSV::Row
row[:header1] # => "column1_1"
row[:header2] # => "column1_2"
row[:header3] # => "column1_3"
row # => #<CSV::Row header1:"column2_1" header2:"column2_2\r\nmulti line data" header3:"column2_3">
row.class # => CSV::Row
row[:header1] # => "column2_1"
row[:header2] # => "column2_2\r\nmulti line data"
row[:header3] # => "column2_3"
row # => #<CSV::Row header1:"column3_1" header2:"column3_2" header3:"column3_3 , contain comma">
row.class # => CSV::Row
row[:header1] # => "column3_1"
row[:header2] # => "column3_2"
row[:header3] # => "column3_3 , contain comma"
field.first # => :header1
field.last # => "column1_1"
field.first # => :header2
field.last # => "column1_2"
field.first # => :header3
field.last # => "column1_3"
field.first # => :header1
field.last # => "column2_1"
field.first # => :header2
field.last # => "column2_2\r\nmulti line data"
field.first # => :header3
field.last # => "column2_3"
field.first # => :header1
field.last # => "column3_1"
field.first # => :header2
field.last # => "column3_2"
field.first # => :header3
field.last # => "column3_3 , contain comma"