# Column Matcher
When you work with spreadsheets and casual users things do not always go as you want.
I worked on a project where users have to upload a spreadsheet with a lot of data about clients purchases.
After 3 upload they call me because the system "did not work well".
The files look like these followiong.
File 1:
Name |
Surname |
Emails |
John |
Smith |
john.smith@gmail.com |
John |
Doe |
john.doe@hotmail.com |
File 2:
Surname |
Name |
E-mail |
Smith |
John |
john.smith@gmail.com |
Doe |
John |
john.doe@hotmail.com |
File 3:
Mail |
Nombre |
Apellido |
john.smith@gmail.com |
John |
Smith |
john.doe@hotmail.com |
John |
Doe |
3 files, 3 different structures. 3 different headers. WTF!
How can i guess the position of the columns i'm looking for?
This gem try to solve the problem
## Install
Add to your Gemfile and run the `bundle` command to install it.
```ruby
gem "columns-matcher"
```
**N.B. Requires Ruby 1.9.2 or later.**
## Use
```ruby
require "columns-matcher"
@matcher = ColumnsMatcher::Matcher.new
# the column that contains the name can be lebeled with "NAME", "NOME" or "NOMBRE"
@matcher.add_column("name", ["NAME", "NOME", "NOMBRE"])
# the column that contains the surname can be lebeled with "SURNAME", "COGNOME" or "APELLIDOS"
@matcher.add_column("cognome", ["SURNAME", "COGNOME", "APELLIDOS"])
# We suppose the header is ["COGNOME", "NOME", "INDIRIZZO"]
@matcher.set_header(header_loaded_from_spreadsheet)
@matcher.column_of("name") # return 1
@matcher.column_of("cognome") # return 0
```
First try is as exact match. If does not work it try with different case:
```ruby
require "columns-matcher"
@matcher = ColumnsMatcher::Matcher.new
# the column that contains the name can be lebeled with "NAME", "NOME" or "NOMBRE"
@matcher.add_column("name", ["name", "nome", "nombre"])
# We suppose the header is ["APELLIDO", "NOMBRE", "ADDRESS"]
@matcher.set_header(header_loaded_from_spreadsheet)
@matcher.column_of("name") # return 1
```
If I can't find the column with exact match or different case match i can also use reg exp
```ruby
require "columns-matcher"
@matcher = ColumnsMatcher::Matcher.new
# the column that contains the name can be lebeled with "NAME", "NOME" or "NOMBRE"
@matcher.add_column("email", ["[Ee]?[\-]*mail[s]*"])
# We suppose the header is ["Surname", "Name", "Emails"]
@matcher.set_header(header_loaded_from_spreadsheet)
@matcher.column_of("email") # return 2
```