我有一个管道分隔的文本文件,我正在循环,看起来像这样:
'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
答案 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]]]}