在Ruby IO中从外部文件读取特定行

3

我有这段代码:

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

只要代码仅提取“Tea”或“coffee”,而不是前面的数字。

尽量避免使用 $ 全局变量,因为据我所知,在 Ruby 中这被认为是不良实践。 - Arie
4个回答

5
听起来您不想返回与某个模式匹配的行,而是想通过行号抓取。
解决方案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)

这个代码需要用什么格式的文本文件才能运行? - Benjamin
@benjamin-shephard 我知道如果你正在使用本地的Ruby解释器和本地的文本文件(即行尾),它会正常工作;例如,在Windows上运行的Ruby和Windows(CRLF)文本文件将正常工作。但是,如果你在Linux系统上使用Windows文本,则该代码可能无法按原样工作。 - Kelvin

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

抱歉:/......这段代码会读取X行,所以如果您想要某一行,它会一直读取直到找到并返回最后一行读取的内容。 顺便问一下,这种方法高效吗? - Nando

0
你可以使用 lines.grep "some string" 来查找特定字符串。 如果你知道具体的行数 x,也可以直接使用 lines[x]

0
我的解决方案是:
我的 testfile.txt 读取如下:
是的
是的确实是
这太棒了
我的 .rb 文件读取如下:
a = IO.readlines("testfile.txt").grep(/\w+/)
puts "它能工作吗...."
sleep 2
puts a[2]
sleep 10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接