class CSVUtils::CSVExtender

Utility class for appending data to a csv file.

Public Class Methods

new(src_csv, dest_csv, csv_options = {}) click to toggle source
# File lib/csv_utils/csv_extender.rb, line 3
def initialize(src_csv, dest_csv, csv_options = {})
  @src_csv = CSVUtils::CSVWrapper.new(src_csv, 'rb', csv_options)
  @dest_csv = CSVUtils::CSVWrapper.new(dest_csv, 'wb', csv_options)
end

Public Instance Methods

append(additional_headers) { |row, current_headers| ... } click to toggle source
# File lib/csv_utils/csv_extender.rb, line 8
def append(additional_headers)
  process(additional_headers) do |current_headers|
    while (row = @src_csv.shift)
      additional_columns = yield row, current_headers
      @dest_csv << (row + additional_columns)
    end
  end
end
append_in_batches(additional_headers, batch_size = 1_000) { |batch, current_headers| ... } click to toggle source
# File lib/csv_utils/csv_extender.rb, line 17
def append_in_batches(additional_headers, batch_size = 1_000)
  process(additional_headers) do |current_headers|
    batch = []

    process_batch_proc = Proc.new do
      additional_rows = yield batch, current_headers

      batch.each_with_index do |row, idx|
        @dest_csv << (row + additional_rows[idx])
      end

      batch = []
    end

    while (row = @src_csv.shift)
      batch << row

      process_batch_proc.call if batch.size >= batch_size
    end

    process_batch_proc.call if batch.size > 0
  end
end

Private Instance Methods

append_headers(additional_headers) click to toggle source
# File lib/csv_utils/csv_extender.rb, line 56
def append_headers(additional_headers)
  return nil unless additional_headers

  current_headers = @src_csv.shift
  @dest_csv << (current_headers + additional_headers)
  current_headers
end
close() click to toggle source
# File lib/csv_utils/csv_extender.rb, line 51
def close
  @src_csv.close
  @dest_csv.close
end
process(additional_headers) { |current_headers| ... } click to toggle source
# File lib/csv_utils/csv_extender.rb, line 43
def process(additional_headers)
  current_headers = append_headers(additional_headers)

  yield current_headers

  close
end