开发者

Reading specific lines from an external file in ruby IO

I have this code:

File.foreach("testfile.txt") { |line| print line }
lines = File.readlines("testfile.txt")
lines.each { |line| print line }

Ex. how could I edit this to get a specific line from testfile.txt ?

$text2 = gets("some code to give me text on line 2 from textfile.txt").chomp

So, I want to run a program that searches for 4 different variables that are editable by anyone. These will be in a separate file and thus the code will not have to be rewritten in order to change the test for a new set of search cases.

Say I have a document (I suppose text is easiest but am probably wrong) that looks like this:

Tea

Coffee

Hot Chocolate

Cookies
开发者_Python百科

That will be all that is in the file. And another file(.rb) pulls these variables and searches for them in Google or whatever. If the code reads in bytes then I wouldn't be able to change the variables to anything longer or shorter.

It would be feasible to have the document say

1:Tea

2:Coffee

3:Hot Chocolate

4:Cookies

So long as the code would only pull out the "Tea" or "coffee" and not the preceding number.


It sounds like you don't want to return a line that matches a certain pattern, but you want to grab by line number.

Solution 1:

def read_line_number(filename, number)
  return nil if number < 1
  line = File.readlines(filename)[number-1]
  line ? line.chomp : nil
end

Solution 2a - a bit more efficient because it doesn't try to read entire file:

require 'english'
def read_line_number_1a(filename, number)
  found_line = nil
  File.foreach(filename) do |line|
    if $INPUT_LINE_NUMBER == number
      found_line = line.chomp
      break
    end
  end
  found_line
end

Solution 2b - also efficient, but in a more functional style (though I haven't checked whether detect will read to end-of-file)

def read_line_number(filename, match_num)
  found_line, _idx =
    File.enum_for(:foreach, filename).each_with_index.detect do |_cur_line, idx|
      cur_line_num = idx+1
      cur_line_num == match_num
    end
  found_line.chomp
end

Usage:

text = read_line_number("testfile.txt", 2)


You would want to use lines.grep "some string". Or just lines[x] if you know exactly which line number x you want.


The solution I have is:

My testfile.txt reads

Yes
Yes is does
Man this is awesome

my .rb file reads

a = IO.readlines("testfile.txt").grep(/\w+/)
puts "does it work...."
sleep 2
puts a[2]
sleep 10


def read_line_number(filename, number)
f = File.open(filename)
l = nil
begin
  number.times do 
  l = f.readline.chomp
  end
rescue
puts "End of file reached"
else
f.close unless f.nil?
return l  
end
end
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜