在Ruby中的数组嵌套迭代过程中跳过值
我读过一个输入文件,并将每列解压缩到单个数组中,如下所示。在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
如果我理解正确的话,也许你可以采取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
此代码假定id
,file_name
和group
将始终具有相同的尺寸。
谢谢了。是的,阵列是相同的大小。对不起延迟回复,我很好奇我做了什么错误。 – Goku
@Goku你的错误是你在迭代时修改了你的数组('.shift');也就是说,您在每次迭代中删除了数组的第一个元素,每次都会使数组变小,但内部索引(用于循环数组)仍然递增1。例如,考虑一个'[“a”,“b”,“c”]'的数组。在第一个循环中,索引将是'0',并且对应于第一个元素,即''a“',现在您将''a''从其中移除,因此您的数组变为'[”b“,”c“]' 。在第二个循环索引是'1',并且对应''c“'。所以你_skipped_'“b”'。 – Gerry
明白了,很好的解释。 +1。再次感谢。 – Goku
在迭代它时正在修改数组。这不可能工作。 –
@Goku我想帮助你,但不明白你真正想要什么。你能否提供带有相应输出的示例输入文件?然后在评论中提及我,我会帮助你。 – DjezzzL
@DjezzzL:我对延迟回复表示歉意。我用示例输入文件和输出编辑了问题。非常感谢您的时间。 – Goku