只读大文件的某些行

时间:2013-09-26 10:47:32

标签: ruby file

我有一个大文本文件(56MB,7500000行)。如果我一次读取整个文件,我会收到OutofMemory错误。我想一次读20000行,做东西,然后继续。如何从特定行开始读取20000行?

3 个答案:

答案 0 :(得分:0)

IO#each_line是你的朋友。

file = File.new('filename', 'r') # or whatever
file.each_line do |line|
  # do something with a line
end

它会有效地读取行,而不是将整个文件加载到内存中。

答案 1 :(得分:0)

此代码符合您的需求,读取一系列最大行,处理它们,清除它们并循环通过eof。重置阵列是消除OutofMemory条件的关键。

class ReadLoop

  lines = Array.new       # Array to hold the next series of lines
  count = 0               # Count of lines read into the current series
  max = 3                 # Maximum number of lines

  file = File.new('yourfilenamehere', 'r') # or whatever

  file.each_line do |line|
    count += 1
    lines << line
    if count == max || file.eof
      then
        puts "Next series of lines:"
        puts lines
        count = 0
        lines = Array.new
    end
  end
end

直接回答你的问题的另一个答案是使用gets(each_line)和lineno。查询lineno会告诉您已调用的次数。设置lineno会手动将当前行号设置为给定值。引用是here。您可以尝试在上面的循环中添加“puts file.lineno”以查看它是如何工作的。

答案 2 :(得分:0)

也许......使用简单的unix命令。例如 sed 从5000到10000行

%x{sed -n 5000,10000p ./file_you_want}.each_line do |line|
  # do with lines
end