2017-05-27 6 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(ストア配列の1番目の要素)でその優先順位がチェックされ、行名 - リーダー(グループ配列の最初の配列要素)から削除する必要があります。

同様に、id \ ruio66のavailabをチェックする必要があります2dnファイルのilty - 行ID-leader_1にあるJohn_Marshaが存在し、存在する場合は削除します。

ように..

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を取ることができますyの異なるアプローチ:

、あなたはネストループする必要はありません。この

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

@ Gookuあなたの間違いは、(.shiftを使って)反復処理中に配列を変更したことです。つまり、繰り返しごとに配列の最初の要素を削除して、配列を小さくする一方、内部インデックス(配列をループするために使用)を1つ増やしています。たとえば、 '[" a "、" b "、" c "]'の配列を考えてみましょう。最初のループインデックスは '0'で、最初の要素、' 'a" 'に対応しています。これで配列は' ["b"、 "c"] ' 。 2番目のループのインデックスは '1 'で、' 'c''に対応します。あなたはスキップしました。 – Gerry

+0

それを得て、優れた説明。 +1。再度、感謝します。 – Goku

関連する問題