2017-05-27 107 views
0

我讀過一個輸入文件,並將每列解壓縮到單個數組中,如下所示。在Ruby中的數組嵌套迭代過程中跳過值

id = ["id\a_po87y", "id\ruio66", "id\rzd766", "id\ruio66", etc..] 

store = ["Jack", "John_Marsha", "123_Smart_option", "John_Marsha", etc...] 

group = ["leader", "leader_1", "fresher", "automation_dev", etc...] 

id_details.txt(輸入文件)

id\a_po87y Jack leader 
id\ruio66 John_Marsha leader_1 
id\rzd766 123_Smart_option fresher 
id\ruio66 John_Marsha automation_dev 
.... 
etc 

我應該如何遍歷以嵌套的方式的陣列以這樣的方式即,陣列的第一個元素 - 的「id」( id_a_po87y)應該在文件Jack_details.txt(存儲數組的第一個元素)中檢查它的屬性,並且應該從行名稱中刪除 - leader(同樣是組數組的第一個數組元素)

同樣,id \ ruio66應該檢查它的可用性2dn文件中的ilty - 行ID中的John_Marsha - leader_1,如果存在,請將其刪除。

等..

id[0]--> store[0]-->group[0] 

id[1]--> store[1]-->group[1] 

and so on 

我的代碼,但值的數組元素

file_dir = 'E:/ruby_work' 

file = File.open("E:/ruby_work/id_details.txt", "r") 
contents = file.each_line.map { |line| line.split("\t") }.transpose 
id, file_name, group = contents 

id.each do |ids| 
    puts "For ID: #{ids}" 
    file_name.each do |name| 
    value = File.open("#{file_dir}/#{name}_details.txt") 
    text = File.read(value) 
    #puts text 
    text.each_line do |el| 
     group.each do |gr| 
     if el.match(/#{gr}/) then 
      print "group row #{gr}\n" 
      print "Its matching\n" 
      replace = text.gsub(/#{Regexp.escape(ids)}\,\s/, '').gsub(/#{Regexp.escape(ids)}/, '').gsub /,\s*$/, '' 
     else print "Not\n" 
      print "group row #{gr}\n" 
     end 
     group.shift 
     end 
    end 
    file_name.shift 
    end 
end 
id.shift 

我在做什麼錯跳過?

Jack_details.txt

Joined on Feb 7, 2016 
Created by: Solomon (ruio66) 

[groups] 
leader_1 = id\rty67, id\mztrt, id\ruio66, ncr\025kc, id\a_po87y 
automation = id\bzo0l4, ccr\poxz7j 
automation_dev = id\ruio66 

John_Marsha_details.txt

Joined on Jan 7, 2016 
Created by: Jack Rondon 

[groups] 
leader_1 = id\sop0r2, id\34_dev, id\mz4d5, id\ruio66 
fresher = id\kzpo98, id\gz8sl7, id\cp0jxr, id\fzxlol, 
automation_dev = id\ruio66 

輸出

For ID: id\a_po87y 
Not 
group row leader 

Not 
group row leader_1 

For ID: id\ruio66 
+0

在迭代它時正在修改數組。這不可能工作。 –

+0

@Goku我想幫助你,但不明白你真正想要什麼。你能否提供帶有相應輸出的示例輸入文件?然後在評論中提及我,我會幫助你。 – DjezzzL

+0

@DjezzzL:我對延遲迴復表示歉意。我用示例輸入文件和輸出編輯了問題。非常感謝您的時間。 – Goku

回答

1

如果我理解正確的話,也許你可以採取slightl Ÿ不同的方法:

考慮到這

id[0]--> store[0]-->group[0] 
id[1]--> store[1]-->group[1] 

那麼你並不需要嵌套的循環,你可以嘗試循環只有一次,使用索引來獲取每個值形成每個陣列,東西像這樣:

(0..id.size - 1).each do |i| 
    puts "For ID: #{id[i]}" 
    value = File.open("#{file_dir}/#{file_name[i]}_details.txt") 
    text = File.read(value) 

    text.each_line do |line| 
    if line.match(/#{group[i]}/) 
     print "group row #{group[i]}\n" 
     print "Its matching\n" 
     replace = text.gsub(/#{Regexp.escape(id[i])}\,\s/, '') 
        .gsub(/#{Regexp.escape(id[i])}/, '') 
        .gsub(/,\s*$/, '') 
    else 
     print "Not\n" 
     print "group row #{group[i]}\n" 
    end 
    end 
end 

此代碼假定idfile_namegroup將始終具有相同的尺寸。

+0

謝謝了。是的,陣列是相同的大小。對不起延遲迴復,我很好奇我做了什麼錯誤。 – Goku

+1

@Goku你的錯誤是你在迭代時修改了你的數組('.shift');也就是說,您在每次迭代中刪除了數組的第一個元素,每次都會使數組變小,但內部索引(用於循環數組)仍然遞增1。例如,考慮一個'[「a」,「b」,「c」]'的數組。在第一個循環中,索引將是'0',並且對應於第一個元素,即''a「',現在您將''a''從其中移除,因此您的數組變爲'[」b「,」c「]' 。在第二個循環索引是'1',並且對應''c「'。所以你_skipped_'「b」'。 – Gerry

+0

明白了,很好的解釋。 +1。再次感謝。 – Goku