2017-05-27 55 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