Sha256: b3ddb33c53dbad2746bf26ed19e078c13dd6cffc78151209c1415f3a04738243

Contents?: true

Size: 921 Bytes

Versions: 1

Compression:

Stored size: 921 Bytes

Contents

# frozen_string_literal: true

require "array_hasher/version"

require "array_hasher/formatter"

require 'csv'
require 'json'

module ArrayHasher
  class << self
    def new_formatter(cols)
      Formatter.new(cols)
    end

    def parse_format(definition)
      definition.map do |val|
        name, type, opts = val.to_s.split(':', 3)

        [
          (name && name.length > 0) ? name.to_sym : nil,
          (type && type.length > 0) ? type.to_sym : nil,
          (opts && opts =~ /\A\{.*\}\z/) ? JSON.parse(opts) : {}
        ]
      end
    end

    def csv_each(path, ext_types = {}, &block)
      csv = CSV.open(path)
      formatter = new_formatter(parse_format(csv.gets))
      formatter.types.merge!(ext_types)
      if block
        csv.each { |line| block.call(formatter.parse(line)) }
      else
        Enumerator.new { |y| csv.each { |line| y << formatter.parse(line) } }
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
array_hasher-0.1.5 lib/array_hasher.rb