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

标签 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) 提取这些变量并在谷歌或其他任何地方搜索它们。如果代码以字节为单位读取,那么我将无法将变量更改为更长或更短的值。

文档说是可行的

1:Tea

2:Coffee

3:Hot Chocolate

4:Cookies

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

最佳答案

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

解决方案一:

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)

关于ruby - 从 ruby​​ IO 中的外部文件读取特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6760883/

相关文章:

ruby-on-rails - Rails 2 和 3 之间子类功能的差异

ruby - :[] do when passed to . 在此 Ruby 语句中发送什么?

ruby-on-rails - 在 HAML 中为背景图像 : -> Object in Rails 插入 SASS

python - 如何使用Python3.6的tarfile模块读取内存?

ruby - 在 Ruby 中打印可编辑到控制台

ruby-on-rails - Rails 根据两个字段查找或创建

ruby-on-rails - Heroku:PG::错误:错误:关系的权限被拒绝

Java 子进程额外输出到控制台

c# - 如何使用 TPL 的 ActionBlock 写入文件?

从文件夹/ja​​r 文件读取资源时用于抽象 I/O 的 Java 库?