Question

I've two files, file1.txt and file2.txt

file1.txt content:

line 1 file 1
line 2 file 1
line 3 file 1

file2.txt content:

line 1 file 2
line 2 file 2
line 3 file 2

And have the following ruby code:

nin_file = File.open "file1.txt"
dev_id_file = File.open "file2.txt"

nin_file.each do |nin_line|
        dev_id_file.each do |dev_line|
                nin_line.delete!("\r\n")
                puts "#{nin_line}  =>   #{dev_line}"
        end
end

nin_file.close
dev_id_file.close


(1..3).each do |e1|
        (1..5).each do |e2|
                puts "#{e1} => #{e2}"
        end
end

And here's the output (why the inner each doesn't work with files, but work for ranges!)

line 1 file 1  =>   line 1 file 2
line 1 file 1  =>   line 2 file 2
line 1 file 1  =>   line 3 file 2
1 => 1
1 => 2
1 => 3
1 => 4
1 => 5
2 => 1
2 => 2
2 => 3
2 => 4
2 => 5
3 => 1
3 => 2
3 => 3
3 => 4
3 => 5
Was it helpful?

Solution

After the first iteration of nin_file.each the stream of dev_id_file is empty:

dev_id_file.each do |dev_line|
  puts "1  =>   #{dev_line}"
end
dev_id_file.each do |dev_line|
  puts "2  =>   #{dev_line}"
end

Outputs:

1  =>   line 1 file 2
1  =>   line 2 file 2
1  =>   line 3 file 2

To have it work every time, you need to do it over an array:

nin_file = File.readlines"file1.txt"
dev_id_file = File.readlines "file2.txt"

nin_file.each do |nin_line|
  dev_id_file.each do |dev_line|
    nin_line.delete!("\r\n")
    puts "#{nin_line}  =>   #{dev_line}"
  end
end

Outputs:

line 1 file 1  =>   line 1 file 2
line 1 file 1  =>   line 2 file 2
line 1 file 1  =>   line 3 file 2
line 2 file 1  =>   line 1 file 2
line 2 file 1  =>   line 2 file 2
line 2 file 1  =>   line 3 file 2
line 3 file 1  =>   line 1 file 2
line 3 file 1  =>   line 2 file 2
line 3 file 1  =>   line 3 file 2

OTHER TIPS

file2 is completely read after first iteration. That's why you don't see any further lines.

This should give your desired output.

nin_file = File.open "file1.txt"
dev_id_file = File.open "file2.txt"

nin_file.each do |nin_line|
        dev_id_file.rewind
        dev_id_file.each do |dev_line|
                nin_line.delete!("\r\n")
                puts "#{nin_line}  =>   #{dev_line}"
        end
end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top