class CSVToSqlite::Parser

Attributes

column_names[R]
db[R]
klass[R]

Public Class Methods

new(source, target, table_name=nil, column_names=nil) click to toggle source
# File lib/csv_to_sqlite/parser.rb, line 14
def initialize(source, target, table_name=nil, column_names=nil)
  if File.exists?(source)
    @source = IO.readlines(source).to_s
  else
    @source = source
  end
  
  @target = target
  @table_name = table_name || 'item'
  @column_names = column_names || _name_columns(@source)
  
  _connect(@target)
  _create_model(@table_name, @column_names)
  
  DataMapper.finalize
  DataMapper.auto_migrate!
end

Public Instance Methods

parse!() click to toggle source
# File lib/csv_to_sqlite/parser.rb, line 32
def parse!
  _parse(@source)
end

Private Instance Methods

_connect(target) click to toggle source
# File lib/csv_to_sqlite/parser.rb, line 38
def _connect(target)
  @db = DataMapper.setup(:default, "sqlite:///#{File.expand_path(target)}")
end
_create_model(table_name, column_names) click to toggle source
# File lib/csv_to_sqlite/parser.rb, line 42
def _create_model(table_name, column_names)
  @klass = DataMapper::Model.new do
    property :id, DataMapper::Property::Serial
    column_names.each do |column|
      property column.to_s.to_sym, DataMapper::Property::String
    end
  end
end
_name_columns(source) click to toggle source
# File lib/csv_to_sqlite/parser.rb, line 51
def _name_columns(source)
  columns = []
  columns_count = 0
  FasterCSV.parse(source) do |row|
    columns_count = row.length if row.length > columns_count
  end
  (0...columns_count).each {|i| columns.push("col_#{i.to_s}")}
  columns
end
_parse(source) click to toggle source
# File lib/csv_to_sqlite/parser.rb, line 61
def _parse(source)
  FasterCSV.parse(source) do |row|
    item = @klass.new()
    row.each_with_index do |column, index|
      item.send("#{@column_names[index]}=", column)
    end
    item.save
  end
end