从ruby IO中的外部文件中读取特定行

时间:2011-07-20 11:03:23

标签: ruby io

我有这段代码:

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

实施例。我怎样才能将其编辑为获取来自testfile.txt的特定行?

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

所以,我想运行一个程序,搜索可由任何人编辑的4个不同变量。这些将在一个单独的文件中,因此不必重写代码,以便更改一组新搜索案例的测试。

说我有一个文件(我认为文字最简单,但可能不对),如下所示:

Tea

Coffee

Hot Chocolate

Cookies

这将是文件中的所有内容。另一个文件(.rb)提取这些变量并在Google或其他任何地方搜索它们。如果代码以字节为单位读取,那么我将无法将变量更改为更长或更短的内容。

让文件说

是可行的
1:Tea

2:Coffee

3:Hot Chocolate

4:Cookies

只要代码只能提取“茶”或“咖啡”而不是前面的数字。

4 个答案:

答案 0 :(得分:3)

听起来您不想返回与某个模式匹配的行,但您想要按行号抓取。

解决方案1:

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

解决方案2a - 效率更高,因为它不会尝试读取整个文件:

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

解决方案2b - 也很有效,但功能更强大(虽然我没有检查detect是否会读到文件结尾)

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

用法:

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

答案 1 :(得分:0)

您可能希望使用lines.grep "some string"。 如果您确切知道所需的行号lines[x],则只需x

答案 2 :(得分:0)

我的解决方案是:

我的testfile.txt读取

是的 是的确是 男人这太棒了

我的.rb文件读取

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

答案 3 :(得分:0)

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