File#each_ine always starting from the begining of the file instead from the specified one

Here is my code :

File.open("#{dir}/input.txt",‘r’) do |file|
file.each_line do |line|
if /^\s+([A-Z][a-z]+)\s*$/ === line
@line_number = file.lineno
break
end
end
end
#puts fruits_line_number

@data_array = []
@header_array = []
@fruit_and_kinds_array = []
@csv_array = []

##below I am tying to line number to a value. But #each_line method
starts ##reading lines from the beginning, instead of starting from the
line ##number I am trying to set.

File.open("#{dir}/input.txt",‘r’) do |file|
p file.lineno = @line_number
file.each_line do |line|
case line
# This will find the parent fruits/vegetables
when /^\s+([A-Z][a-z]+)\s*$/
@parent_fruit = line.strip
# This will match sub classes of the parent fruit/vegetable class
when /^([A-Z][a-z]+)\s?/?(\s?[A-Z][a-z]+\s?/?)\s$/
@fruit_and_kinds_array.clear unless @fruit_and_kinds_array.empty?
@fruit_and_kinds_array << line.strip
when /^\s*$/m,/\A[^@\s]+@([^@\s]+.)+[^@\s]+\z/
# blank line or line having email addresses, so do nothing
# This will match all the header names of the actual data
when /\b(^variety|kg|pp)\b/i
@header_array.clear unless @header_array.empty?
@header_array.concat line.strip.split
else
# this will collect all the actual fruits/vegetables data
puts @data_array << line.strip.unpack(“A25A12A15A6A*”)
@csv_array += @fruit_and_kinds_array + @header_array +
@data_array[0…-2] + @data_array[-1].split
@data_array.clear
puts @csv_array
end
end
end

How can I do, what I am trying to achieve ?

Hi Arup,

##below I am tying to line number to a value. But #each_line method
starts ##reading lines from the beginning, instead of starting from the
line ##number I am trying to set.

Yes, this is the intended behaviour.
And IO#lineno= doesn’t “forward” to the linenumber.
It just set the line counter to a given value. It’s like saying, now,
this line will be called “Line number X” (even if it’s the Yth line of
the file).

Some tips in a previous post bellow.
https://www.ruby-forum.com/topic/5603

Best regards and Keep Rubying!
Abinoam Jr.

Abinoam Jr. wrote in post #1139333:

Hi Arup,

##below I am tying to line number to a value. But #each_line method
starts ##reading lines from the beginning, instead of starting from the
line ##number I am trying to set.

Yes, this is the intended behaviour.
And IO#lineno= doesn’t “forward” to the linenumber.
It just set the line counter to a given value. It’s like saying, now,
this line will be called “Line number X” (even if it’s the Yth line of
the file).

Some tips in a previous post bellow.
IO.lineno= not behaving as expected - Ruby - Ruby-Forum

I am having file, where line number varies between 99967-10,000 as far
as I have seen. The file header has lots of data, which I don’t want to
extract. Thus I first search a word and make a note the line number of
that word. Now my next task is to directly start from that line number
till the end. As you can see, I am using lots of regex on each line. So
I don’t want to apply all the regex to the lines of data, which I don’t
need.

Can anyone give the idea, about this. as File#lineno= not helping me
on this. What are the other approaches I can apply there ?

Regis d’Aubarede wrote in post #1139391:

elow I am tying to line number to a value. But #each_line method

starts ##reading lines from the beginning, instead of starting from the
line ##number I am trying to set.

with f.seek you can pre-position reading cursor

This does the trick.

Thank you very much.

elow I am tying to line number to a value. But #each_line method

starts ##reading lines from the beginning, instead of starting from the
line ##number I am trying to set.

with f.seek you can pre-position reading cursor

====================
position=-1
File.open(FILE,‘r’) do |file|
position=file.tell while (line=file.gets) && line !~ /#{‘X’*3}/
break
end

File.open(FILE,‘r’) do |file| # XXX
file.seek(position)
file.each_line do |line|
puts “%4d | %-s” % [file.lineno,line]
end
end if position>=0

$ ruby essai.rb
1 | File.open(FILE,‘r’) do |file| # XXX
2 | file.seek(position)
3 | file.each_line do |line|
4 | puts “%4d | %-s” % [file.lineno,line]
5 | end
6 | end if position>=0