Sha256: f5ed53052a382980cf7f4a149ee99ded61fcef0576a3ec4230ee33c8aaee3fd0

Contents?: true

Size: 1.48 KB

Versions: 10

Compression:

Stored size: 1.48 KB

Contents

require 'arc-furnace/csv_to_hash_with_duplicate_headers'
require 'arc-furnace/enumerator_source'
require 'csv'

module ArcFurnace
  class CSVSource < EnumeratorSource
    include CSVToHashWithDuplicateHeaders

    attr_reader :value, :file, :csv, :delimiter, :group_by,
      :key_column, :preprocessed_csv

    COMMA = ','.freeze

    def initialize(
      filename: nil,
      csv: nil,
      encoding: 'UTF-8',
      delimiter: COMMA,
      group_by: false,
      key_column: nil
    )
      @file = File.open(filename, encoding: encoding) if filename
      @csv = csv
      @delimiter = delimiter
      @preprocessed_csv = []
      @group_by = group_by
      @key_column = key_column
      super()
    end

    alias_method :group_by?, :group_by

    #
    # note that group_by requires the entire file to be
    # read into memory
    #
    def preprocess
      if group_by?
        parse_file { |row| @preprocessed_csv << csv_to_hash_with_duplicates(row) }
        @preprocessed_csv = @preprocessed_csv.group_by { |row| row[key_column] }
      end
    end

    def finalize
      file.close if file
    end

    def build_enumerator
      Enumerator.new do |yielder|
        if group_by?
          preprocessed_csv.each { |_, array| yielder.yield(array) }
        else
          parse_file { |row| yielder.yield(csv_to_hash_with_duplicates(row)) }
        end
      end
    end

    def parse_file
      (csv ? csv : CSV.new(file, { headers: true, col_sep: delimiter })).each { |row| yield row }
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
arc-furnace-0.1.42 lib/arc-furnace/csv_source.rb
arc-furnace-0.1.41 lib/arc-furnace/csv_source.rb
arc-furnace-0.1.40 lib/arc-furnace/csv_source.rb
arc-furnace-0.1.39 lib/arc-furnace/csv_source.rb
arc-furnace-0.1.38 lib/arc-furnace/csv_source.rb
arc-furnace-0.1.37 lib/arc-furnace/csv_source.rb
arc-furnace-0.1.36 lib/arc-furnace/csv_source.rb
arc-furnace-0.1.35 lib/arc-furnace/csv_source.rb
arc-furnace-0.1.34 lib/arc-furnace/csv_source.rb
arc-furnace-0.1.33 lib/arc-furnace/csv_source.rb