在Ruby数组中找到重复数据,将它们的值相加,然后将它们组合起来

时间:2016-10-11 14:47:15

标签: arrays ruby

我有一个管道分隔的文本文件,我正在循环,看起来像这样:

'A' === 'C'

我开始抓取这些行的第一个,第十个和第十一个索引,并将它们放入一个数组数组中,如下所示:

bar

所以我得到了类似的东西:

123|ADAM JOHNSON|AAUA|||||||||||1||||
123||AAUA||||||||8675|90.0|90.0||||||||
444|STEVE SMITH|AAUA|||||||||||1|||||
444||AAUA||||||||2364|50.0|50.0|||||||
444||AAUA||||||||8453|50.0|50.0||||
567|ALLEN JONES|AAUA|||||||||||1||||||
567||AAUA||||||||6578|75.0|75.0||||||
567||AAUA||||||||1234|10.0|10.0||||
567||AAUA||||||||1234|15.0|15.0|||||

我正在努力的是循环遍历数组,找到具有相同第一个索引(3个整数id)的分组,循环遍历然后在第二个数组中找到具有相同4个整数id的任何重复项,然后添加第三个index浮动然后吐出最后一个数组,删除重复项并将它们的值相加。

预期输出应如下所示:

CSV.foreach('data.txt', { :col_sep => '|' }) do |row|
  if row[1].nil?
    @group_array << [row[0], [row[10], row[11]]]
  end
end

2 个答案:

答案 0 :(得分:1)

根据创建方式,我认为您的数据项看起来不像[["123", ["8675", "90.0"]]] ...更有可能看起来像["123", ["8675", "90.0"]]

在这种情况下,这应该做你想要的......

group_array = @group_array.sort
result = []
save_3 = nil
save_4 = nil
total = 0.0
group_array.each do |group|
  if group[0] != save_3 || group[1][0] != save_4
    result << [save_3, [save_4, total.to_s]] if save_3
    total = 0.0
    save_3 = group[0]
    save_4 = group[1][0]
  end
  total += group[1][1].to_f
end
result << [save_3, [save_4, total.to_s]] if save_3

答案 1 :(得分:0)

好的,应该扩大一点......

group_hash = Hash.new(0.0)
CSV.foreach('data.txt', { :col_sep => '|' }) do |row|
  if row[1].nil?
    group_hash[ [row[0], row[10]] ] += row[11].to_f
  end
end
# produces a hash with key [a, b] value sum_of_c
# if you need an array of [a, [b,c]] then next step is...
@group_array = group_hash.to_a.map{|entry| [entry[0][0], [entry[0][1], entry[1]]]}