Class: TrueTable::Table
- Inherits:
-
Array
- Object
- Array
- TrueTable::Table
- Defined in:
- lib/true_table/table.rb
Instance Method Summary collapse
-
#+(other) ⇒ Object
Combines table with other and returns a new one.
-
#-(cols) ⇒ Object
Returns a new table without specified columns.
-
#[](key) ⇒ Object
(also: #row)
Returns a row or a column.
-
#[]=(key, value) ⇒ Object
Adds or updates a row or a column.
-
#col(key) ⇒ Object
Returns a column as Array.
-
#cols ⇒ Object
Returns a hash of columns.
-
#compact ⇒ Object
Returns a copy of self without rows that contain nil in any column.
-
#compact! ⇒ Object
Removes rows with nil in any column.
-
#delete_at(index) ⇒ Object
(also: #delete_col, #delete_row)
Delete a row or a column in place and returns the deleted row/column.
-
#difference(*others) ⇒ Object
Returns a table with different rows.
-
#dig(*indexes) ⇒ Object
Extracts nested value.
-
#each_col ⇒ Object
Iterates over columns.
-
#headers ⇒ Object
Returns an array of column headers.
-
#intersection(*others) ⇒ Object
Returns a new table with intersecting rows.
-
#join(row_separator = $,, col_separator = nil, with_headers: false) ⇒ Object
Returns a string with joined rows and columns.
-
#last(*args) ⇒ Object
Returns the last row or a new table with the last N rows.
-
#reject ⇒ Object
Returns a new table without rejected rows.
-
#reverse ⇒ Object
Returns a reversed copy.
-
#select ⇒ Object
(also: #filter)
Returns a new table with selected rows.
-
#sort ⇒ Object
Returns a new sorted table.
-
#sort_by ⇒ Object
Returns a new sorted table.
-
#to_csv(row_separator = "\n", col_separator = ",") ⇒ Object
Returns a CSV string.
-
#values ⇒ Object
Returns only values, without any headers (array of arrays).
Instance Method Details
#+(other) ⇒ Object
Combines table with other and returns a new one
4 5 6 7 8 |
# File 'lib/true_table/table.rb', line 4 def +(other) result = self.class.new each_row { |row, i| result << row.merge(other[i]) } result end |
#-(cols) ⇒ Object
Returns a new table without specified columns
11 12 13 14 15 16 |
# File 'lib/true_table/table.rb', line 11 def -(cols) keep_keys = headers - cols result = self.class.new each_row { |row, i| result << row.slice(*keep_keys) } result end |
#[](key) ⇒ Object Also known as: row
Returns a row or a column
19 20 21 |
# File 'lib/true_table/table.rb', line 19 def [](key) key.is_a?(Symbol) || key.is_a?(String) ? col(key.to_sym) : super end |
#[]=(key, value) ⇒ Object
Adds or updates a row or a column
24 25 26 |
# File 'lib/true_table/table.rb', line 24 def []=(key, value) key.is_a?(Symbol) || key.is_a?(String) ? add_col(key.to_sym, value) : super end |
#col(key) ⇒ Object
Returns a column as Array
29 30 31 |
# File 'lib/true_table/table.rb', line 29 def col(key) map { |row| row[key] } end |
#cols ⇒ Object
Returns a hash of columns
34 35 36 37 38 |
# File 'lib/true_table/table.rb', line 34 def cols result = {} each_col { |col, header| result[header] = col } result end |
#compact ⇒ Object
Returns a copy of self without rows that contain nil in any column
41 42 43 |
# File 'lib/true_table/table.rb', line 41 def compact dup.compact! end |
#compact! ⇒ Object
Removes rows with nil in any column
46 47 48 |
# File 'lib/true_table/table.rb', line 46 def compact! delete_if { |row| row.values.include? nil } end |
#delete_at(index) ⇒ Object Also known as: delete_col, delete_row
Delete a row or a column in place and returns the deleted row/column
51 52 53 54 55 56 57 58 59 60 |
# File 'lib/true_table/table.rb', line 51 def delete_at(index) if index.is_a?(Symbol) || index.is_a?(String) result = self[index] return nil unless result each_row { |row, i| row.delete index } result else super end end |
#difference(*others) ⇒ Object
Returns a table with different rows
65 66 67 |
# File 'lib/true_table/table.rb', line 65 def difference(*others) self.class.new super end |
#dig(*indexes) ⇒ Object
Extracts nested value. Accepts row, column or column, row
70 71 72 73 74 75 76 77 |
# File 'lib/true_table/table.rb', line 70 def dig(*indexes) key = indexes.shift if key.is_a?(Symbol) || key.is_a?(String) col(key.to_sym).dig *indexes else row(key).dig *indexes end end |
#each_col ⇒ Object
Iterates over columns
80 81 82 |
# File 'lib/true_table/table.rb', line 80 def each_col headers.each { |header| yield col(header), header } end |
#headers ⇒ Object
Returns an array of column headers
88 89 90 |
# File 'lib/true_table/table.rb', line 88 def headers first.keys end |
#intersection(*others) ⇒ Object
Returns a new table with intersecting rows
93 94 95 |
# File 'lib/true_table/table.rb', line 93 def intersection(*others) self.class.new super end |
#join(row_separator = $,, col_separator = nil, with_headers: false) ⇒ Object
Returns a string with joined rows and columns
98 99 100 101 102 103 104 105 |
# File 'lib/true_table/table.rb', line 98 def join(row_separator = $,, col_separator = nil, with_headers: false) if col_separator result = map { |row| row.values.join col_separator }.join(row_separator) with_headers ? headers.join(col_separator) + row_separator + result : result else super row_separator end end |
#last(*args) ⇒ Object
Returns the last row or a new table with the last N rows
108 109 110 |
# File 'lib/true_table/table.rb', line 108 def last(*args) args.empty? ? super : self.class.new(super) end |
#reject ⇒ Object
Returns a new table without rejected rows
113 114 115 |
# File 'lib/true_table/table.rb', line 113 def reject self.class.new super end |
#reverse ⇒ Object
Returns a reversed copy
118 119 120 |
# File 'lib/true_table/table.rb', line 118 def reverse self.class.new super end |
#select ⇒ Object Also known as: filter
Returns a new table with selected rows
126 127 128 |
# File 'lib/true_table/table.rb', line 126 def select self.class.new super end |
#sort ⇒ Object
Returns a new sorted table
132 133 134 |
# File 'lib/true_table/table.rb', line 132 def sort self.class.new super end |
#sort_by ⇒ Object
Returns a new sorted table
137 138 139 |
# File 'lib/true_table/table.rb', line 137 def sort_by self.class.new super end |
#to_csv(row_separator = "\n", col_separator = ",") ⇒ Object
Returns a CSV string
142 143 144 |
# File 'lib/true_table/table.rb', line 142 def to_csv(row_separator = "\n", col_separator = ",") join(row_separator, col_separator, with_headers: true) end |
#values ⇒ Object
Returns only values, without any headers (array of arrays)
147 148 149 |
# File 'lib/true_table/table.rb', line 147 def values map { |row| row.values } end |