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