lib/rbbt/tsv/manipulate.rb in rbbt-util-4.0.2 vs lib/rbbt/tsv/manipulate.rb in rbbt-util-4.1.0

- old
+ new

@@ -51,10 +51,16 @@ @new_fields.collect{|field| field == :key ? [key] : values[field] } ] end + def process_reorder_flat(key, values) + [ values, + @new_fields.collect{|field| field == :key ? + [key] : values[field] }.flatten + ] + end def initialize(key_field, fields, new_key_field, new_fields, type, uniq) @new_key_field = TSV.identify_field(key_field, fields, new_key_field) raise "Key field #{ new_key_field } not found" if @new_key_field.nil? @new_fields = case @@ -126,29 +132,32 @@ else self.instance_eval do alias process process_subset_list end end end else - if type == :double + case type + when :double if uniq self.instance_eval do alias process process_reorder_double_uniq end else self.instance_eval do alias process process_reorder_double end end + when :flat + self.instance_eval do alias process process_reorder_flat end else self.instance_eval do alias process process_reorder_list end end end end end #{{{ Methods - def through(new_key_field = nil, new_fields = nil, uniq = false) + def through(new_key_field = nil, new_fields = nil, uniq = false, zipped = false) - traverser = Traverser.new @key_field, @fields, new_key_field, new_fields, type, uniq + traverser = Traverser.new key_field, fields, new_key_field, new_fields, type, uniq if @monitor desc = "Iterating TSV" step = 100 if Hash === @monitor @@ -162,29 +171,75 @@ each do |key, value| progress_monitor.tick if progress_monitor keys, value = traverser.process(key, value) + + # Annotated with Entity and NamedArray + if not @unnamed + if not traverser.new_field_names.nil? + case type + when :double, :list + NamedArray.setup value, traverser.new_field_names + when :flat, :single + Entity.formats[traverser.new_field_names.first].setup(value, :format => traverser.new_field_names.first) if defined?(Entity) and Entity.respond_to?(:formats) and Entity.formats.include? traverser.new_field_names + end + end + end + next if keys.nil? - keys.each do |key| - NamedArray.setup value, traverser.new_field_names if Array === value and not @unnamed - yield key, value + + if zipped + + keys.each_with_index do |k,i| + v = value.collect{|v| + r = v[i] + r = v[0] if r.nil? + r + } + + if not @unnamed and defined?(Entity) and not traverser.new_key_field_name.nil? and Entity.respond_to?(:formats) and Entity.formats.include? traverser.new_key_field_name + k = Entity.formats[traverser.new_key_field_name].setup(k.dup, :format => traverser.new_key_field_name) + end + v.key = k if NamedArray === v + yield k, v + + end + + else + keys.each do |key| + if not @unnamed and defined?(Entity) and not traverser.new_key_field_name.nil? and Entity.respond_to?(:formats) and Entity.formats.include? traverser.new_key_field_name + key = Entity.formats[traverser.new_key_field_name].setup(key.dup, :format => traverser.new_key_field_name) + end + value.key = key if NamedArray === value + yield key, value + end end end [traverser.new_key_field_name, traverser.new_field_names] end - def reorder(new_key_field = nil, new_fields = nil, persist = false) - Persist.persist_tsv self, self.filename, {:key_field => new_key_field, :fields => new_fields}, {:persist => persist, :persist_prefix => "Reorder:"} do |data| + def reorder(new_key_field = nil, new_fields = nil, options = {}) + zipped, uniq = Misc.process_options options, :zipped, :uniq + persist_options = Misc.pull_keys options, :persist + persist_options[:prefix] = "Reorder" + + Persist.persist_tsv self, self.filename, {:key_field => new_key_field, :fields => new_fields}, persist_options do |data| + with_unnamed do - new_key_field_name, new_field_names = through new_key_field, new_fields do |key, value| - if data.include?(key) and type == :double - data[key] = data[key].zip(value).collect do |old_list, new_list| old_list + new_list end + new_key_field_name, new_field_names = through new_key_field, new_fields, uniq, zipped do |key, value| + if data.include?(key) and not zipped + case type + when :double + data[key] = data[key].zip(value).collect do |old_list, new_list| old_list + new_list end + when :flat + data[key].concat value + end else - data[key] = value + data[key] = value.dup end end data.extend TSV unless TSV === data data.key_field = new_key_field_name @@ -365,10 +420,10 @@ when type == :single self[key] = new_values when type == :flat self[key] = new_values else - values[field].replace new_values + values[field_pos].replace new_values self[key] = values end end end