如何从文件中获取特定行

Ski*_*zit 18 ruby file-io

是否可以从知道其行号的文件中提取特定行?例如,只是N从文件"text.txt"中获取行的内容作为字符串?

Jon*_*röm 22

你可以通过索引得到它readlines.

line = IO.readlines("file.txt")[42]
Run Code Online (Sandbox Code Playgroud)

如果它是一个小文件,请仅使用它.

  • 使用line = IO.readlines("file.txt")[41]来读取第42行 (3认同)
  • 如果文件很小(小于2 MB),这才是正确的答案。否则,它将迫使Ruby一次加载整个文件,在大文件的情况下,这比使用基于`foreach`或`gets`的解决方案要慢。请参阅包含基准的http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad。 (2认同)

Nak*_*lon 14

尝试以下两种解决方案之一:

file = File.open "file.txt"

#1 solution would eat a lot of RAM
p [*file][n-1]

#2 solution would not
n.times{ file.gets }
p $_

file.close
Run Code Online (Sandbox Code Playgroud)


Aug*_*aas 5

def get_line_from_file(path, line)
  result = nil

  File.open(path, "r") do |f|
    while line > 0
      line -= 1
      result = f.gets
    end
  end

  return result
end

get_line_from_file("/tmp/foo.txt", 20)
Run Code Online (Sandbox Code Playgroud)

这是一个很好的解决方案,因为:

  • 您不使用File.read,因此不会将整个文件读入内存。如果文件的大小为20MB,并且您经常阅读,因此GC不能跟上,这样做可能会成为问题。
  • 您只需从文件中读取,直到所需的行。如果您的文件有1000行,获得第20行只会将Ruby的前20行读入。

如果您想引发错误(),而不是在越界行时不返回nil getsreadline则可以替换为EOFError

  • 我认为将整个20MB的文件读入内存以从中获取一行信息对任何语言都是不好的做法。 (4认同)
  • @AugustLilleaas在您使用某种语言时,您_应该_应该惯用地编写它,前提是仅是因为语言经常比其他语言更优化惯用结构。另外,如果有人要维护您的代码,那么学习不正确的方法也是一种伤害。 (4认同)
  • 值得庆幸的是,我可以按照自己的方式写任意数量的红宝石,而我不必听货主希望我做的事情:) (2认同)