extend: Forwardable
CSV::Table は CSV ドキュメントを表す二次元のデータ構造です。行単位や列単位の操作を行うことが出来ます。また必要であれば CSV に戻すこともできます。
ヘッダ行の処理が有効である場合、CSV から返されるテーブルは全てこのクラスから構築されます。
以下のメソッドを Array に委譲します。
以下の三種類のモードがあります。
デフォルトはこのモードです。このマニュアル内ではミックスモードと呼んでいます。行単位でアクセスするか列単位でアクセスするか自動的に判断します。
ロウモード。テーブルに行単位でアクセスします。
カラムモード。テーブルに列単位でアクセスします。
new(array_of_rows) -> CSV::Table
[permalink][rdoc]自身を初期化します。
全ての行が同じヘッダを持つことを仮定しています。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2])
table.to_a # => [["header1", "header2"], ["row1_1", "row1_2"], ["row2_1", "row2_2"]]
self << row_or_array -> self
[permalink][rdoc]自身の最後に新しい行を追加します。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1])
table << row2
table.to_a # => [["header1", "header2"], ["row1_1", "row1_2"], ["row2_1", "row2_2"]]
self == other -> bool
[permalink][rdoc]自身の全ての行が比較対象と同じである場合は真を返します。そうでない場合は偽を返します。
require "csv"
row1_1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row1_2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
row2_1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2_2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table1 = CSV::Table.new([row1_1, row1_2])
table2 = CSV::Table.new([row2_1, row2_2])
table1 == table2 # => true
table2 << CSV::Row.new(["header1", "header2"], ["row3_1", "row3_2"])
table1 == table2 # => false
self[index_or_header] -> object
[permalink][rdoc]ミックスモードでは、このメソッドは引数に行番号を指定すれば行単位で動作し、ヘッダの名前を指定すれば列単位で動作します。
このメソッドを呼び出す前に CSV::Table#by_col! を呼び出すとカラムモードになります。また CSV::Table#by_row! を呼び出すとロウモードになります。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2])
table[0] # => #<CSV::Row "header1":"row1_1" "header2":"row1_2">
table[1] # => #<CSV::Row "header1":"row2_1" "header2":"row2_2">
table.by_col!
table[0] # => ["row1_1", "row2_1"]
table[1] # => ["row1_2", "row2_2"]
self[index_or_header] = value
[permalink][rdoc]ミックスモードでは、このメソッドは引数に行番号を指定すれば行単位で動作し、ヘッダの名前を指定すれば列単位で動作します。
このメソッドを呼び出す前に CSV::Table#by_col! を呼び出すとカラムモードになります。また CSV::Table#by_row! を呼び出すとロウモードになります。
行には配列か CSV::Row のインスタンスを指定します。
列に値を一つだけ指定した場合は、全ての行にその値をコピーします。配列を指定した場合は、上から順に値を割り当てます。余分な値は無視します。また、値が不足している場合は nil を割り当てます。
既存の行または列のデータを上書きします。新しい列を追加する場合は、右端に列を追加します。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
row3 = CSV::Row.new(["header1", "header2"], ["row3_1", "row3_2"])
table = CSV::Table.new([row1, row2])
table[0] # => #<CSV::Row "header1":"row1_1" "header2":"row1_2">
table[1] # => #<CSV::Row "header1":"row2_1" "header2":"row2_2">
table[1] = row3
table[1] # => #<CSV::Row "header1":"row3_1" "header2":"row3_2">
table.by_col!
table[0] # => ["row1_1", "row3_1"]
table[1] # => ["row1_2", "row3_2"]
table[1] = ["row1_2", "row2_2"]
table[1] # => ["row1_2", "row2_2"]
by_col -> CSV::Table
[permalink][rdoc]カラムモードになっている新しい CSV::Table オブジェクトを返します。
元のテーブルモードを変更せずにメソッドチェーンできるので便利です。しかし、大きなデータセットに対しても同じだけメモリを消費するので気をつけてください。
このメソッドは複製したテーブルを返すので、破壊的なメソッドはメソッドチェーンに組込まないようにしてください。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2])
col_table = table.by_col
col_table[0] # => ["row1_1", "row2_1"]
col_table[1] # => ["row1_2", "row2_2"]
by_col! -> self
[permalink][rdoc]自身をカラムモードに変更します。
再びモードが変更されるまで、いくつかのメソッドはカラム単位で動きます。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2])
table.by_col!
table[0] # => ["row1_1", "row2_1"]
table[1] # => ["row1_2", "row2_2"]
by_col_or_row -> CSV::Table
[permalink][rdoc]ミックスモードになっている新しい CSV::Table オブジェクトを返します。
元のテーブルモードを変更せずにメソッドチェーンできるので便利です。しかし、大きなデータセットに対しても同じだけメモリを消費するので気をつけてください。
このメソッドは複製したテーブルを返すので、破壊的なメソッドはメソッドチェーンに組込まないようにしてください。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2]).by_col!
table # => #<CSV::Table mode:col row_count:3>
col_or_row_table = table.by_col_or_row
col_or_row_table # => #<CSV::Table mode:col_or_row row_count:3>
table # => #<CSV::Table mode:col row_count:3>
by_col_or_row! -> self
[permalink][rdoc]自身をミックスモードに変更します。
再びモードが変更されるまで、いくつかのメソッドはミックスモードで動きます。
デフォルトのミックスモードではインデックスによるアクセスは行単位での参照であると見なします。しかし、他の方法ではヘッダによる列単位での参照であると見なします。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2]).by_col!
table # => #<CSV::Table mode:col row_count:3>
table.by_col_or_row!
table # => #<CSV::Table mode:col_or_row row_count:3>
by_row -> CSV::Table
[permalink][rdoc]ロウモードになっている新しい CSV::Table オブジェクトを返します。
元のテーブルモードを変更せずにメソッドチェーンできるので便利です。しかし、大きなデータセットに対しても同じだけメモリを消費するので気をつけてください。
このメソッドは複製したテーブルを返すので、破壊的なメソッドはメソッドチェーンに組込まないようにしてください。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2])
table # => #<CSV::Table mode:col_or_row row_count:3>
row_table = table.by_row # => #<CSV::Table mode:row row_count:3>
row_table[0] # => #<CSV::Row "header1":"row1_1" "header2":"row1_2">
row_table[1] # => #<CSV::Row "header1":"row2_1" "header2":"row2_2">
by_row! -> self
[permalink][rdoc]自身をロウモードに変更します。
再びモードが変更されるまで、いくつかのメソッドは行単位で動きます。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2])
table # => #<CSV::Table mode:col_or_row row_count:3>
table.by_row!
table # => #<CSV::Table mode:row row_count:3>
table[0] # => #<CSV::Row "header1":"row1_1" "header2":"row1_2">
table[1] # => #<CSV::Row "header1":"row2_1" "header2":"row2_2">
delete(index_or_header) -> object
[permalink][rdoc]指定された行か列を削除して返します。
デフォルトのミックスモードではインデックスによるアクセスは行単位での参照であると見なします。しかし、他の方法ではヘッダによる列単位での参照であると見なします。
探索方法を変更したい場合は CSV::Table#by_col!, CSV::Table#by_row! を使用してください。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2])
table.delete(1)
table.to_a # => [["header1", "header2"], ["row1_1", "row1_2"]]
[SEE_ALSO] CSV::Table#by_col!, CSV::Table#by_row!, CSV::Table#delete_if
delete_if {|row| ... } -> self
[permalink][rdoc]delete_if {|column_name, values| ... } -> self
ブロックを評価した結果が真である行か列を削除します。
デフォルトのミックスモードかロウモードでは、行単位で繰り返します。カラムモードでは、ブロックに列名と対応する値の配列を与え、列単位で繰り返します。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "valid"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "invalid"])
row3 = CSV::Row.new(["header1", "header2"], ["row3_1", "valid"])
table = CSV::Table.new([row1, row2, row3])
table.delete_if { |row| row["header2"] == "invalid" }
table.to_a # => [["header1", "header2"], ["row1_1", "valid"], ["row3_1", "valid"]]
require "csv"
row1 = CSV::Row.new(["id", "name"], [1, "tanaka"])
row2 = CSV::Row.new(["id", "name"], [2, "suzuki"])
row3 = CSV::Row.new(["id", "name"], [3, "sato"])
table = CSV::Table.new([row1, row2, row3])
table.by_col!
table.delete_if { |column_name, values| column_name == "id" }
table.to_a # => [["name"], ["tanaka"], ["suzuki"], ["sato"]]
[SEE_ALSO] CSV::Table#delete
each {|row| ... } -> self
[permalink][rdoc]each {|column_name, values| ... } -> self
デフォルトのミックスモードかロウモードでは、行単位で繰り返します。カラムモードでは、ブロックに列名と対応する値の配列を与え、列単位で繰り返します。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
row3 = CSV::Row.new(["header1", "header2"], ["row3_1", "row3_2"])
table = CSV::Table.new([row1, row2, row3])
table.each { |row| p row }
# => #<CSV::Row "header1":"row1_1" "header2":"row1_2">
# => #<CSV::Row "header1":"row2_1" "header2":"row2_2">
# => #<CSV::Row "header1":"row3_1" "header2":"row3_2">
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
row3 = CSV::Row.new(["header1", "header2"], ["row3_1", "row3_2"])
table = CSV::Table.new([row1, row2, row3])
table.by_col!
table.each { |column_name, values| print column_name, values, "\n" }
# => header1["row1_1", "row2_1", "row3_1"]
# => header2["row1_2", "row2_2", "row3_2"]
empty? -> bool
[permalink][rdoc]Array#empty? に委譲します。
[SEE_ALSO] Array#empty?
headers -> Array
[permalink][rdoc]自身のヘッダ行を返します。
テーブルが空である場合は空の配列を返します。
require "csv"
row = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
table = CSV::Table.new([row])
table.headers # => ["header1", "header2"]
inspect -> String
[permalink][rdoc]モードとサイズを US-ASCII な文字列で返します。
例:
require 'csv' csv = CSV.new("a,b,c\n1,2,3", headers: true) table = csv.read table.inspect # => "#<CSV::Table mode:col_or_row row_count:2>"
length -> Integer
[permalink][rdoc]size -> Integer
Array#length, Array#size に委譲します。
[SEE_ALSO] Array#length, Array#size
mode -> Symbol
[permalink][rdoc]現在のアクセスモードを返します。
require "csv"
row = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
table = CSV::Table.new([row])
table.mode # => :col_or_row
table.by_col!
table.mode # => :col
push(*rows) -> self
[permalink][rdoc]複数の行を追加するためのショートカットです。
以下と同じです。
require 'csv' csv = CSV.new("a,b,c\n,1,2,3", headers: true) table = csv.read rows = [[4, 5, 6], [7, 8, 9]] rows.each{|row| table << row }
table -> Array
[permalink][rdoc]同値性を比較するために内部的に使用します。
to_a -> [Array]
[permalink][rdoc]配列の配列を返します。
一番目の要素はヘッダで、残りの要素はデータを表わします。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2])
table.to_a # => [["header1", "header2"], ["row1_1", "row1_2"], ["row2_1", "row2_2"]]
to_csv(options = Hash.new) -> String
[permalink][rdoc]to_s(options = Hash.new) -> String
CSV の文字列に変換して返します。
ヘッダを一行目に出力します。その後に残りのデータを出力します。
デフォルトでは、ヘッダを出力します。オプションに :write_headers => false を指定するとヘッダを出力しません。
例:
require 'csv' csv = CSV.new("a,b,c\n,1,2,3", headers: true) table = csv.read table.to_csv # => "a,b,c\n1,2,3\n" table.to_csv(write_headers: false) # => "1,2,3\n"
values_at(indices_or_headers) -> Array
[permalink][rdoc]デフォルトのミックスモードでは、インデックスのリストを与えると行単位の参照を行い、行の配列を返します。他の方法は列単位の参照と見なします。行単位の参照では、返り値は行ごとの配列を要素に持つ配列です。
探索方法を変更したい場合は CSV::Table#by_col!, CSV::Table#by_row! を使用してください。
アクセスモードを混在させることはできません。
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2])
table.values_at(1) # => [#<CSV::Row "header1":"row2_1" "header2":"row2_2">]
require "csv"
row1 = CSV::Row.new(["header1", "header2"], ["row1_1", "row1_2"])
row2 = CSV::Row.new(["header1", "header2"], ["row2_1", "row2_2"])
table = CSV::Table.new([row1, row2])
table.by_col!
table.values_at(1) # => [["row1_2"], ["row2_2"]]
[SEE_ALSO] CSV::Table#by_col!, CSV::Table#by_row!