parent
476ea5e6fa
commit
8a36632ddd
@ -0,0 +1,58 @@
|
||||
require 'forwardable'
|
||||
#---
|
||||
# Excerpted from "Seven Languages in Seven Weeks",
|
||||
# published by The Pragmatic Bookshelf.
|
||||
# Copyrights apply to this code. It may not be used to create training material,
|
||||
# courses, books, articles, and the like. Contact us if you are in doubt.
|
||||
# We make no guarantees that this code is fit for any purpose.
|
||||
# Visit http://www.pragmaticprogrammer.com/titles/btlang for more book information.
|
||||
#---
|
||||
module ActsAsCsv
|
||||
def self.included(base)
|
||||
base.extend ClassMethods
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
def acts_as_csv
|
||||
include InstanceMethods
|
||||
end
|
||||
end
|
||||
|
||||
module InstanceMethods
|
||||
extend Forwardable
|
||||
include Enumerable
|
||||
|
||||
def read
|
||||
@csv_contents = []
|
||||
filename = self.class.to_s.downcase + '.txt'
|
||||
file = File.new(filename)
|
||||
@headers = file.gets.chomp.split(',')
|
||||
|
||||
file.each do |row|
|
||||
@csv_contents << CsvRow.new(@headers, row.chomp.split(','))
|
||||
end
|
||||
end
|
||||
|
||||
attr_accessor :headers, :csv_contents
|
||||
def_delegators :@csv_contents, :each
|
||||
def initialize
|
||||
read
|
||||
end
|
||||
end
|
||||
|
||||
class CsvRow < Struct.new(:headers, :cells)
|
||||
def method_missing(name)
|
||||
self.cells[self.headers.index(name.to_s)]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class RubyCsv # no inheritance! You can mix it in
|
||||
include ActsAsCsv
|
||||
acts_as_csv
|
||||
end
|
||||
|
||||
m = RubyCsv.new
|
||||
puts m.headers.inspect
|
||||
puts m.csv_contents.inspect
|
||||
m.each {|row| puts row.one}
|
@ -0,0 +1,3 @@
|
||||
one,two
|
||||
lions,tigers
|
||||
bears,sheep
|
Loading…
Reference in new issue