Sha256: bac69e9d309243dd81cb5b5d67738deb0a4962ae10cd7816da0140e988274507

Contents?: true

Size: 1.46 KB

Versions: 25

Compression:

Stored size: 1.46 KB

Contents

# Utility class for appending data to a csv file.
class CSVUtils::CSVExtender
  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

  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

  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

  def process(additional_headers)
    current_headers = append_headers(additional_headers)

    yield current_headers

    close
  end

  def close
    @src_csv.close
    @dest_csv.close
  end

  def append_headers(additional_headers)
    return nil unless additional_headers

    current_headers = @src_csv.shift
    @dest_csv << (current_headers + additional_headers)
    current_headers
  end
end

Version data entries

25 entries across 25 versions & 1 rubygems

Version Path
csv-utils-0.3.24 lib/csv_utils/csv_extender.rb
csv-utils-0.3.23 lib/csv_utils/csv_extender.rb
csv-utils-0.3.22 lib/csv_utils/csv_extender.rb
csv-utils-0.3.21 lib/csv_utils/csv_extender.rb
csv-utils-0.3.20 lib/csv_utils/csv_extender.rb
csv-utils-0.3.19 lib/csv_utils/csv_extender.rb
csv-utils-0.3.18 lib/csv_utils/csv_extender.rb
csv-utils-0.3.17 lib/csv_utils/csv_extender.rb
csv-utils-0.3.16 lib/csv_utils/csv_extender.rb
csv-utils-0.3.15 lib/csv_utils/csv_extender.rb
csv-utils-0.3.14 lib/csv_utils/csv_extender.rb
csv-utils-0.3.13 lib/csv_utils/csv_extender.rb
csv-utils-0.3.12 lib/csv_utils/csv_extender.rb
csv-utils-0.3.11 lib/csv_utils/csv_extender.rb
csv-utils-0.3.10 lib/csv_utils/csv_extender.rb
csv-utils-0.3.9 lib/csv_utils/csv_extender.rb
csv-utils-0.3.8 lib/csv_utils/csv_extender.rb
csv-utils-0.3.7 lib/csv_utils/csv_extender.rb
csv-utils-0.3.6 lib/csv_utils/csv_extender.rb
csv-utils-0.3.5 lib/csv_utils/csv_extender.rb