2012-12-17 48 views
-1

我有一個XML文件與<pb n="4-DIGIT-NUMBER" ... />。這個數字在某些情況下是相同的,所以我想消除歧義,到目前爲止,但現在問題與計數(我有正確的方法?=> 3))Ruby:迭代子數組和計數項目;回寫入元素

1)讀取所有數字到一個陣列,產生一個很長的名單:

Dir.chdir("./Tustep/luxneu") 
sammel = [] 
open("lp42tags.txt").each do |x| 
    if x =~ /<pb n="(\d\d\d\d)/ 
    sammel << $1 
    end 
end 

2)查找號碼重複,並把它們放到子陣

dupl_groups = sammel.select{|i| sammel.grep(i).size > 1}.group_by{|x| x}.values 
p dupl_groups 
# (much shorter example)=> [["0119", "0119"], ["0147", "0147"], ["0156", "0156", "0156"]] 

3)現在,我想我能以某種方式計算每個子陣列的元素,並把他們回到(或成爲副本..)。我想要[[「0119:1」,「0119:2」],[...],[「0156:1」,「0156:2」,「0156:3」],可能是這樣的(但只有搞笑的循環幾乎無盡的數字計算...:/)

dupl_counted = [] 
dupl_groups.each do |outer| 
    count = 1 
    dupl_groups do |inner| 
    #puts inner.inspect 
    inner_new = inner.to_s.sub(/(.+)/, "\\1:#{count}") 
    dupl_counted << inner_new 
    count += count 
    end 
end 

嚴重缺陷..?也許使用「each_with_index」的東西呢?此外,我需要這些小組以計算有意義的數據塊(切片3左右是不可接受的,因爲有2-6個重複的數字)。如果我可以在它的子陣列中分割數組,那麼它們會像普通數組一樣產生它們,那會好嗎?

在此先感謝! 勒內·T.

+0

不要試圖用正則表達式解析XML。使用[Nokogiri](http://nokogiri.org),這是一個出色的解析器。另外,您需要展示正在分析的XML樣本,否則您會讓我們猜測您正在處理的內容。 –

回答

0

這應該是map只是一個嵌套的應用程序 - 一旦到外組,然後給每個元素中:

dupl_groups.map do |gp| 
    gp.map.with_index {|el, ix| el + ":#{ix+1}"} 
end 
# => [["0119:1", "0119:2"], ["0147:1", "0147:2"], ["0156:1", "0156:2", "0156:3"]] 
+0

是的,當然內部循環的元素是來自外部的元素,並且在地圖上改變數組元素 - 方法工作正常。非常感謝你! :) – rogoshijn