Class: Eco::CSV::Table
- Inherits:
-
CSV::Table
- Object
- CSV::Table
- Eco::CSV::Table
- Defined in:
- lib/eco/csv/table.rb
Instance Method Summary collapse
-
#add_column(header_name) ⇒ Eco::CSV::Table
Adds a new column at the end.
-
#columns ⇒ Array<Array>
Each array is the column header followed by its values.
-
#columns_hash ⇒ Hash
Creates a single
Hash
where each key, value is a column (header + values). - #delete_column(i) ⇒ Eco::CSV::Table
-
#delete_duplicates! ⇒ Object
It removes all rows where all columns' values are the same.
-
#duplicated_header_names ⇒ Array<String>
List of duplicated header names.
- #empty? ⇒ Boolean
- #equal_rows?(row1, row2) ⇒ Boolean
-
#group_by(&block) ⇒ Hash
Where keys are the groups and the values a
Eco::CSV::Table
. -
#initialize(input) ⇒ Table
constructor
A new instance of Table.
-
#length ⇒ Integer
Total number of rows not including the header.
-
#merge_same_header_names ⇒ Eco::CSV::Table
When there are headers with the same name, it merges those columns.
- #rows ⇒ Array<::CSV::Row>
-
#slice(*index) ⇒ Eco::CSV::Table
Slices the selected rows.
- #slice_columns(*index) ⇒ Eco::CSV::Table
-
#to_a_h ⇒ Object
Returns an array of row hashes.
- #to_array_of_hashes ⇒ Object
-
#transform_headers ⇒ Eco::CSV::Table
It allows to rename the header names.
- #transform_values ⇒ Eco::CSV::Table
Constructor Details
#initialize(input) ⇒ Table
Returns a new instance of Table.
7 8 9 |
# File 'lib/eco/csv/table.rb', line 7 def initialize(input) super(to_rows_array(input)) end |
Instance Method Details
#add_column(header_name) ⇒ Eco::CSV::Table
Adds a new column at the end
113 114 115 116 |
# File 'lib/eco/csv/table.rb', line 113 def add_column(header_name) new_col = Array.new(length).unshift(header_name) columns_to_table(columns.push(new_col)) end |
#columns ⇒ Array<Array>
Returns each array is the column header followed by its values.
154 155 156 |
# File 'lib/eco/csv/table.rb', line 154 def columns to_a.transpose end |
#columns_hash ⇒ Hash
it will override columns with same header name
Creates a single Hash
where each key, value is a column (header + values)
161 162 163 164 165 |
# File 'lib/eco/csv/table.rb', line 161 def columns_hash columns.map do |col| [col.first, col[1..-1]] end.to_h end |
#delete_column(i) ⇒ Eco::CSV::Table
104 105 106 107 108 |
# File 'lib/eco/csv/table.rb', line 104 def delete_column(i) csv_cols = columns csv_cols.delete(i) columns_to_table(csv_cols) end |
#delete_duplicates! ⇒ Object
It removes all rows where all columns' values are the same
126 127 128 129 130 131 132 133 |
# File 'lib/eco/csv/table.rb', line 126 def delete_duplicates! unique_rows = [] self.by_row!.delete_if do |row| unique_rows.any? {|done| equal_rows?(row, done)}.tap do |found| unique_rows << row unless found end end end |
#duplicated_header_names ⇒ Array<String>
Returns list of duplicated header names.
56 57 58 59 |
# File 'lib/eco/csv/table.rb', line 56 def duplicated_header_names header = self.headers header.select {|e| header.count(e) > 1}.uniq end |
#empty? ⇒ Boolean
149 150 151 |
# File 'lib/eco/csv/table.rb', line 149 def empty? length < 1 end |
#equal_rows?(row1, row2) ⇒ Boolean
138 139 140 141 142 |
# File 'lib/eco/csv/table.rb', line 138 def equal_rows?(row1, row2) row1.fields.zip(row2.fields).all? do |(v1, v2)| v1 == v2 end end |
#group_by(&block) ⇒ Hash
Returns where keys are the groups and the values a Eco::CSV::Table
.
12 13 14 15 16 |
# File 'lib/eco/csv/table.rb', line 12 def group_by(&block) rows.group_by(&block).transform_values do |rows| self.class.new(rows) end end |
#length ⇒ Integer
Returns total number of rows not including the header.
145 146 147 |
# File 'lib/eco/csv/table.rb', line 145 def length to_a.length - 1 end |
#merge_same_header_names ⇒ Eco::CSV::Table
it also offers a way to resolve merge conflicts
When there are headers with the same name, it merges those columns
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/eco/csv/table.rb', line 32 def merge_same_header_names dups = self.duplicated_header_names out_rows = self.map do |row| row.to_a.each_with_object({}) do |(name, value), out| if dups.include?(name) && out.key?(name) if block_given? yield(value, out[name], name) else # resolve value || out[name] end elsif out.key?(name) out[name] else value end.tap do |final_value| out[name] = final_value end end end self.class.new(out_rows) end |
#rows ⇒ Array<::CSV::Row>
119 120 121 122 123 |
# File 'lib/eco/csv/table.rb', line 119 def rows [].tap do |out| self.each {|row| out << row} end end |
#slice(*index) ⇒ Eco::CSV::Table
Slices the selected rows
77 78 79 80 81 82 83 84 |
# File 'lib/eco/csv/table.rb', line 77 def slice(*index) case index.first when Range, Numeric self.class.new(rows.slice(index.first)) else self end end |
#slice_columns(*index) ⇒ Eco::CSV::Table
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/eco/csv/table.rb', line 87 def slice_columns(*index) case index.first when Range, Numeric columns_to_table(columns.slice(index.first)) when String csv_cols = columns csv_cols = index.each_with_object([]) do |name, cols| col = csv_cols.find {|col| col.first == name} cols << col if col end columns_to_table(csv_cols) else self end end |
#to_a_h ⇒ Object
it will override columns with same header
Returns an array of row hashes
169 170 171 |
# File 'lib/eco/csv/table.rb', line 169 def to_a_h rows.map(&:to_h) end |
#to_array_of_hashes ⇒ Object
174 175 176 |
# File 'lib/eco/csv/table.rb', line 174 def to_array_of_hashes to_a_h end |
#transform_headers ⇒ Eco::CSV::Table
It allows to rename the header names
20 21 22 23 24 25 26 27 |
# File 'lib/eco/csv/table.rb', line 20 def transform_headers header = self.headers cols = self.columns cols.each do |col| col[0] = yield(col.first) end columns_to_table(cols) end |
#transform_values ⇒ Eco::CSV::Table
62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/eco/csv/table.rb', line 62 def transform_values transformed_rows = rows.map do |row| res = yield(row) case res when Array ::CSV::Row.new(row.headers, res) when ::CSV::Row res end end self.class.new(transformed_rows) end |