Ruby - 如何读取从文件到数组的前n行

时间:2014-07-11 23:22:25

标签: ruby

出于某种原因,我找不到任何提及如何做到这一点的教程...... 那么,我如何从文件中读取前n行?

我想出了:

while File.open('file.txt') and count <= 3 do |f|
  ...
    count += 1
  end
end

但它不起作用,对我来说也不是很好看。

出于好奇,我尝试过这样的事情:

File.open('file.txt').10.times do |f|

但这也不起作用。

那么,是否有一种简单的方法可以只读取前n行而无需加载整个文件? 非常感谢你!

5 个答案:

答案 0 :(得分:24)

这是一个单线解决方案:

lines = File.foreach('file.txt').first(10)

我担心它可能不会以提示方式关闭文件(它可能只在垃圾收集器删除File.foreach返回的Enumerator后关闭文件)。但是,我使用了strace,我发现如果你在没有块的情况下调用File.foreach,它会返回一个枚举器,每次在该枚举器上调用first方法时,它都会打开该文件,尽可能多地读取,然后关闭该文件。这很好,因为这意味着你可以使用上面的代码行,Ruby不会让文件保持打开状态。

答案 1 :(得分:5)

有很多方法可以在Ruby中解决这个问题。这是一种方式:

File.open('Gemfile') do |f|
  lines = 10.times.map { f.readline }
end

答案 2 :(得分:3)

File.foreach('file.txt').with_index do |line, i|
    break if i >= 10
    puts line
end

答案 3 :(得分:0)

File继承自IO和Enumerable methods which include #first中的IO混合

将整数传递给first(n)将返回可编号集合中的前n个项目。对于File对象,每个项目都是文件中的一行。

File.open('filename.txt', 'r').first(10)

这将返回包含\ n换行符的行数组。 您可能想#join来创建一个完整的字符串。

File.open('filename.txt', 'r').first(10).join

答案 4 :(得分:-1)

您可以尝试以下方法:

`head -n 10 file`.split

这不是真正的“纯粹的红宝石”,但现在这几乎不是必需的。