lib/rbbt/tsv/accessor.rb in rbbt-util-5.6.11 vs lib/rbbt/tsv/accessor.rb in rbbt-util-5.6.12
- old
+ new
@@ -546,23 +546,70 @@
new = self.dup
ENTRY_KEYS.each{|entry| new.delete entry}
new
end
- def unzip(field = 0)
+ def unzip(field = 0, merge = false)
new = {}
field_pos = self.identify_field field
self.through do |key,values|
field_values = values.delete_at field_pos
zipped = values.zip_fields
- field_values.zip(zipped) do |value, *rest|
- new[[key,value]*":"] = Misc.zip_fields(rest)
+ field_values.zip(zipped).each do |value, *rest|
+ k = [key,value]*":"
+ if merge and new.include? k
+ new[k] = Misc.zip_fields(rest)
+ else
+ new[k] = Misc.zip_fields(rest)
+ end
end
end
self.annotate new
new.type = :list
+
+ new.key_field = [self.key_field, self.fields[field_pos]] * ":"
+ new_fields = self.fields.dup
+ new_fields.delete_at field_pos
+ new.fields = new_fields
+
+ new
+ end
+
+ def unzip(field = 0, merge = false)
+ new = {}
+ self.annotate new
+
+ field_pos = self.identify_field field
+ new.with_unnamed do
+ if merge
+ self.through do |key,values|
+ field_values = values.delete_at field_pos
+ zipped = values.zip_fields
+ field_values.zip(zipped).each do |field_value,rest|
+ k = [key,field_value]*":"
+ if new.include? k
+ new[k] = Misc.zip_fields(Misc.zip_fields(new[k]) << rest)
+ else
+ new[k] = rest.collect{|v| [v]}
+ end
+ end
+ end
+ new.type = :double
+ else
+ self.through do |key,values|
+ field_values = values.delete_at field_pos
+ zipped = values.zip_fields
+ field_values.zip(zipped).each do |field_value,rest|
+ k = [key,field_value]*":"
+ new[k] = rest
+ end
+ end
+ new.type = :list
+ end
+ end
+
new.key_field = [self.key_field, self.fields[field_pos]] * ":"
new_fields = self.fields.dup
new_fields.delete_at field_pos
new.fields = new_fields