Class: CsvStreamer
Constant Summary collapse
- BYTE_ARRAY_UTF_BOM =
[0xff, 0xfe].collect{|byte| byte.chr}.join
- UTF_16_LE_ICONV =
Iconv.new('UTF-16LE', 'UTF-8')
- COLUMN_SEPARATOR =
"\t"- ROW_SEPARATOR =
"\n"
Instance Attribute Summary collapse
-
#csv_sequence ⇒ Object
readonly
Returns the value of attribute csv_sequence.
Class Method Summary collapse
Instance Method Summary collapse
- #each {|BYTE_ARRAY_UTF_BOM| ... } ⇒ Object
-
#initialize(model_class, ids, csv_sequence = nil, per_page = 1000, filter_mappings = {}, &block) ⇒ CsvStreamer
constructor
A new instance of CsvStreamer.
- #to_csv(array) ⇒ Object
Constructor Details
#initialize(model_class, ids, csv_sequence = nil, per_page = 1000, filter_mappings = {}, &block) ⇒ CsvStreamer
Returns a new instance of CsvStreamer.
11 12 13 14 15 16 17 18 |
# File 'lib/csv_streamer.rb', line 11 def initialize(model_class,ids,csv_sequence = nil, per_page = 1000, filter_mappings = {}, &block) @ids = ids @model_class = model_class @csv_sequence = csv_sequence || self.class.csv_sequence(@model_class) @per_page = per_page @filter_mappings = filter_mappings @block = block end |
Instance Attribute Details
#csv_sequence ⇒ Object (readonly)
Returns the value of attribute csv_sequence.
10 11 12 |
# File 'lib/csv_streamer.rb', line 10 def csv_sequence @csv_sequence end |
Class Method Details
.csv_sequence(model_class) ⇒ Object
20 21 22 |
# File 'lib/csv_streamer.rb', line 20 def self.csv_sequence(model_class) model_class.properties.collect {|p| p.name} - [:id] end |
Instance Method Details
#each {|BYTE_ARRAY_UTF_BOM| ... } ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/csv_streamer.rb', line 28 def each elements_count = @ids.size page_counter = 0 yield BYTE_ARRAY_UTF_BOM yield to_csv(@csv_sequence) while (page_counter * @per_page <= elements_count) do elements = @model_class.all(:id=>@ids[page_counter*@per_page,@per_page]) elements.each do |element| element = @block.call(element) unless @block.nil? csv = to_csv(@csv_sequence.collect do |field| fieldval = element.send(field) if @filter_mappings.has_key?(field) filterblock = eval "Proc.new {#{@filter_mappings[field]}}" fieldval = filterblock.call(fieldval) end fieldval end) yield StringIO.new(csv).read end page_counter = page_counter + 1 end end |
#to_csv(array) ⇒ Object
24 25 26 |
# File 'lib/csv_streamer.rb', line 24 def to_csv(array) UTF_16_LE_ICONV.iconv(array.join(COLUMN_SEPARATOR) + ROW_SEPARATOR) end |