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

Ben*_*min 3 ruby io

我有这个代码:

File.foreach("testfile.txt") { |line| print line }
lines = File.readlines("testfile.txt")
lines.each { |line| print line }
Run Code Online (Sandbox Code Playgroud)

前任。我如何编辑它以获取特定行testfile.txt

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

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

假设我有一个文档(我认为文本是最简单的,但可能是错误的),如下所示:

Tea

Coffee

Hot Chocolate

Cookies
Run Code Online (Sandbox Code Playgroud)

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

该文件说是可行的

1:Tea

2:Coffee

3:Hot Chocolate

4:Cookies
Run Code Online (Sandbox Code Playgroud)

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

Kel*_*vin 5

听起来您不想返回与特定模式匹配的行,但您想按行号进行抓取。

解决方案一:

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

解决方案 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
Run Code Online (Sandbox Code Playgroud)

解决方案 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
Run Code Online (Sandbox Code Playgroud)

用法:

text = read_line_number("testfile.txt", 2)
Run Code Online (Sandbox Code Playgroud)