# TableTransform [![Gem Version](https://badge.fury.io/rb/table_transform.svg)](http://badge.fury.io/rb/table_transform) [![Build Status](https://travis-ci.org/jonas-lantto/table_transform.svg)](https://travis-ci.org/jonas-lantto/table_transform) [![Code Climate](https://codeclimate.com/github/jonas-lantto/table_transform/badges/gpa.svg)](https://codeclimate.com/github/jonas-lantto/table_transform) [![Test Coverage](https://codeclimate.com/github/jonas-lantto/table_transform/badges/coverage.svg)](https://codeclimate.com/github/jonas-lantto/table_transform/coverage) [![Issue Count](https://codeclimate.com/github/jonas-lantto/table_transform/badges/issue_count.svg)](https://codeclimate.com/github/jonas-lantto/table_transform) Utility to work with csv type data in a name safe environment with utilities to transform data ## Installation Add this line to your application's Gemfile: gem 'table_transform' And then execute: $ bundle Or install it yourself as: $ gem install table_transform ## Usage ### Create and populate # Create from file t = TableTransform::Table::create_from_file('data.csv') # Create empty table with given column names t = TableTransform::Table::create_empty(%w(Col1 Col2)) t << {'Col1' => 1, 'Col2' => 2} # Create from an array of arrays. First row column names data = [ %w(Name Age), %w(Jane 22)] t = TableTransform::Table.new(data) ### Transform # Add a new column to the far right t.add_column('NameLength'){|row| row['Name'].size} # Change values in existing column t.change_column('Age'){|row| row['Age'].to_i} # Will remove given columns. One or several can be specified. t.delete_column('Name', 'Address') # Rename column r.rename_column('Age', 'Years') # Create a new Table with given column in specified order t.extract(%w(Length Name)) # Filter table t.filter{|row| row['Age].to_i > 20} # Adds rows of two tables with same header t1 = TableTransform::Table::create_empty(%w(Col1 Col2)) t2 = TableTransform::Table::create_empty(%w(Col1 Col2)) t3 = t1 + t2 ### Inspect and traverse # Loop through all rows t.each_row{|row| puts row['Rebate'].to_f * row['Price'].to_f} #### Table::Row `Table::each_row` return a `Table::Row`
A row can access its values by column name e.g. `row['Name']` #### Table:Cell # Table::Cell < String row['operating_system'].downcase == 'centos' # include_any? c = row['Col1'] # c = 'CHECK' c.include_any?(%w(AA EC DD))) # true ### Properties There are two categories of properties, Table and Column
Same interface for interacting with properties # Update - add or update :name property in existing p p.update({name: 'xxx'}) # Reset - resets p with given property, clearing previous properties p.reset({name: 'xxx'}) # Delete p.delete(:name) # Each p.each{|x| ...} # Access p[:name] #### Table properties # Set table name - override default name t.table_properties.update({name: 'Table1'}) # Set turn on/off auto filter button t.table_properties.update({auto_filter: false}) #### Column properties # Set format for one column t.column_properties['Tax'].update({format: '0.0%'}) # Extract properties t.column_properties['Tax'] # {format: '0.0%'} # Add meta data during add_column t.add_column('Tax', {format: '0.0%'}){|row| 0.25} ### Formula Formulas can be added to columns. They have to be in US locale. Column values will be nil if inspected # Add formula to column t.add_column_formula('OnePlusOne', '1+1') # Add formula to column with meta data t.add_column_formula('OnePlusOne', '1+1' {format: '0.0'}) #### Formula helper To aid when creating formulas there are a few helpers available f = TableTransform::FormulaHelper # Namespace alias # Column f::column('price') # <=> [price] t.add_column_formula('Total value', "#{f::column('price')}*f::column('volume')}") # Table f::table('Table1') # <=> Table1[] # Text (will avoid the clutter of protecting " character) f::text('No') # <=> "No" # VLOOKUP, convenience function to extract values from another table # Finds the street name in table Address for name specified in column Name f::vlookup(f::column('Name'), 'Address', 'Street')) f::vlookup('[Name]', 'Address', 'Street')) # Finds the number of pets in Table Pets for name specified in column Name. If name does not exist it defaults to 0 f::vlookup(f::column('Name'), 'Pets', 'nPets', 0)) f::vlookup('[Name]', 'Pets', 'nPets', 0)) ### Publish # Export as array t.to_a # Excel sheet excel = TableTransform::ExcelCreator.new('output.xlsx') excel.add_tab('Result', t) excel.create! #### Excel Creator Will create an Excel Table on each tab. Name of the table will be the same as the sheet (except space replaced with _) Each column will be auto scaled to an approximate size based on column content. ## Contributing Bug reports and pull requests are welcome on [GitHub](https://github.com/jonas-lantto/table_transform). ## License The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).