Sha256: 19889bb272be09fd7af1d0f18800817a1cd679bd16e2a789cede7a29d6f56001
Contents?: true
Size: 1.52 KB
Versions: 1
Compression:
Stored size: 1.52 KB
Contents
module SimpleCsv class Reader < Base attr_reader :index def initialize(path, **opts, &block) settings merge: opts unless opts[:seperator] settings merge: { seperator: detect_delimiter(path) } end headers(*find_headers(path)) if settings[:headers] @csv = @original = CSV.open File.expand_path(path), settings instance_eval(&block) end def in_groups_of(size, &block) @original.each_slice(size) do |group| @csv = group instance_eval(&block) end @index = nil @csv = @original end def each_row(*arr_opts, &block) @index ||= 0 if arr_opts.include?(:with_index) @csv.each do |record| @record = record instance_eval(&block) @index += 1 if @index end end def respond_to_missing?(mtd, include_private = false) super end def method_missing(mtd, *args, &block) @headers.include?(mtd.to_s) ? @record[mtd.to_s] : super end private def find_headers(csv_path) sep = detect_delimiter(csv_path) first_line(csv_path).split(sep).map { |h| h.gsub(/^"*|"*$/, '') } end def detect_delimiter(csv_path) line = first_line(csv_path) @delimiters = COMMON_DELIMITERS.map { |sep| [sep, line.scan(sep).length] } .sort { |a, b| b[1] <=> a[1] } @delimiter ||= @delimiters[0][0] end def first_line(csv_path) @first_line ||= File.open(File.expand_path(csv_path), &:readline) end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
simple_csv-0.1.0 | lib/simple_csv/reader.rb |