Module: ParseLine
- Defined in:
- lib/parseline.rb
Overview
[email protected] www.hashcode.eti.br
The purpose of gem parseline is to help the developers to load external CSV and fixed width files.
Installation
sudo gem sources –add gems.github.com sudo gem install parseline
How to Use
As single data mapper
Using CSV
You can use the files delimited by a character or using regexp. To demonstrate its we’ll use a migration/table
class CreateProducts < ActiveRecord::Migration
def self.up
create_table :products do |t|
t.integer :code
t.string :name
t.boolean :in_stock
t.date :date
t.float :price
end
end
def self.down
drop_table :products
end
end
and a given file called ‘data.csv’ with the content below.
1;PRODUT 1;Y;;11/21/2008;90.00 2;PRODUT 2;N;;11/22/2008;341.33 3;PRODUT 3;N;;11/01/2008;1.99 4;PRODUT 4;Y;;11/15/2008;34.98 5;PRODUT 5;N;;11/14/2008;130.44 6;PRODUT 6;Y;;11/05/2008;20.11
The descriptions of data layout are
product’s code;name;if it is in stock;*reserved for future use*;date;price
As you can see we need format the column ‘in stock’ to boolean format and convert the date format from MM/DD/YYYY to YYYY-MM-DD. For every parse.field call, you receive the field to format using a lambda block.
so, take a look at the ActiveRecord definition using the module ParseLine::CSV require ‘parseline’
class Product < ActiveRecord::Base
extend ParseLine::CSV
csv_layout :delimiter => ";" do |parse|
parse.field :code
parse.field :name
parse.ignore_field
parse.field :in_stock, lambda {|s| s == 'Y' }
parse.field :date , lambda {|d| d.gsub(/(\d{2})\/(\d{2})\/(\d{4})/,'\3-\1-\2') }
parse.field :price
end
end
Each column will be mapped into a field, except the column after :name that is being ignored.
Loading external file
There are two ways that load data, by line use method Product.load_line to return an instance of Product
data_file=File.readlines(“data.csv”) @product=Product.load_line data_file.first or loading from file with all records returns an array of Products
@products=Product.load_lines “data.csv”
Using Fixed Width
To load data with Fixed Width we need do a extend the module ParseLine::FixedWidth. It uses the same class methods to load data, the load_line and load_lines. See the file Fixed Width
000001PRODUT 1 Y 11/21/2008000090.00 000002PRODUT 2 N 11/22/2008000341.33 000003PRODUT 3 N 11/01/2008000001.99 000004PRODUT 4 Y 11/15/2008000034.98 000005PRODUT 5 N 11/14/2008000130.44 000006PRODUT 6 Y 11/05/2008000020.11
let’s split those lines and define a model like require ‘parseline’
class Product < ActiveRecord::Base
extend ParseLine::FixedWidth
fixed_width_layout do |parse|
parse.field :code , 0..5
parse.field :name, 6..21
parse.field :in_stock, 22..22, lambda {|s| s == 'Y' }
parse.field :date , 24..33, lambda {|d| d.gsub(/(\d{2})\/(\d{2})\/(\d{4})/,'\3-\1-\2') }
parse.field :price, 34..42
end
end
After that
@products=Product.load_lines "data.csv"
Remember to use the parse module It’s easy to do, so enjoy and make money with it!
Defined Under Namespace
Modules: CSV, FixedWidth