Class: CSVUtils::CSVTransformer

Inherits:
Object
  • Object
show all
Defined in:
lib/csv_utils/csv_transformer.rb

Overview

Transforms a CSV given a series of steps

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(src_csv, dest_csv, csv_options = {}) ⇒ CSVTransformer

Returns a new instance of CSVTransformer.



5
6
7
8
# File 'lib/csv_utils/csv_transformer.rb', line 5

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

Instance Attribute Details

#headersObject (readonly)

Returns the value of attribute headers.



3
4
5
# File 'lib/csv_utils/csv_transformer.rb', line 3

def headers
  @headers
end

Instance Method Details

#additional_data(&block) ⇒ Object



15
16
17
18
# File 'lib/csv_utils/csv_transformer.rb', line 15

def additional_data(&block)
  steps << [:additional_data, @headers, block]
  self
end

#append(additional_headers, &block) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/csv_utils/csv_transformer.rb', line 36

def append(additional_headers, &block)
  steps << [:append, @headers, block]

  if additional_headers
    @headers += additional_headers
  else
    @headers = nil
  end

  self
end

#each(&block) ⇒ Object



48
49
50
51
# File 'lib/csv_utils/csv_transformer.rb', line 48

def each(&block)
  steps << [:each, @headers, block]
  self
end

#map(new_headers, &block) ⇒ Object



30
31
32
33
34
# File 'lib/csv_utils/csv_transformer.rb', line 30

def map(new_headers, &block)
  steps << [:map, @headers, block]
  @headers = new_headers
  self
end

#process(batch_size = 10_000, &block) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/csv_utils/csv_transformer.rb', line 58

def process(batch_size = 10_000, &block)
  batch = []

  @dest_csv << @headers if @headers

  steps_proc = Proc.new do
    steps.each do |step_type, current_headers, proc|
      batch = process_step(step_type, current_headers, batch, &proc)
    end

    batch.each { |row| @dest_csv << row }

    batch = []
  end
                 
  while (row = @src_csv.shift)
    batch << row
    steps_proc.call if batch.size >= batch_size
  end

  steps_proc.call if batch.size > 0

  @src_csv.close
  @dest_csv.close
end

#read_headersObject



10
11
12
13
# File 'lib/csv_utils/csv_transformer.rb', line 10

def read_headers
  @headers = @src_csv.shift
  self
end

#reject(&block) ⇒ Object



25
26
27
28
# File 'lib/csv_utils/csv_transformer.rb', line 25

def reject(&block)
  steps << [:reject, @headers, block]
  self
end

#select(&block) ⇒ Object



20
21
22
23
# File 'lib/csv_utils/csv_transformer.rb', line 20

def select(&block)
  steps << [:select, @headers, block]
  self
end

#set_headers(headers) ⇒ Object



53
54
55
56
# File 'lib/csv_utils/csv_transformer.rb', line 53

def set_headers(headers)
  @headers = headers
  self
end