如何使用ruby向后读取文件然后转发?

时间:2015-03-27 20:56:56

标签: ruby file

我有几个kb到1 mb的svn日志文件,通常是kb。它们包含零个,一个或多个以下文本块:

---------------------------------
r3457 | programmer1 | 03.20.2015
changed file1.txt
added file7.txt
etc...
team1: adding new feature to app
---------------------------------

我想在每个文件中获得最后一次签到。在上面的示例中,最后一次登记是3457.

所以,为此,我将从底部读取一个文件,继续向上阅读,直到我找到一条虚线。然后,我将向前移动并阅读最后一次检查的下一行。

我该怎么做?我读了一些关于elif的内容,但无法弄清楚api。我也尝过一篇帖子,但不清楚 - Easy question: Read file, reverse it and write to another file in Ruby

我可以这样做,但我不想把它写到另一个文件。

o = File.new("ouput.txt", "w+")

File.new("my_file.txt").lines.reverse_each { |line|
    o.puts line 
}
o.close

万分感谢!

2 个答案:

答案 0 :(得分:2)

很少kb到1 mb,无需进行复杂的字节级文件读取。只需读取数组中的行,然后使用rindex获取最后一个虚线。

ar = File.readlines('test.txt')
# dashes_idx = ar.rindex("---------------------------------\n")
dashes_idx = ar.rindex{|line| line.end_with?("----------\n")}
p ar[dashes_idx + 1].split(" | ").first

答案 1 :(得分:1)

我制作了一个这样的日志分析器:

Bytes = 10000
File.open(filename){|f|
  puts "Open #{f.path}, get last #{Bytes} bytes"
  f.seek(-Bytes, IO::SEEK_END  )
  puts f.readlines
}

此snipplet读取文件的最后10000字节(请参阅Bytes之前的减号)并打印出来。

只需估算一条记录的大小,然后尝试读取最后的x条目。在这些条目中你可以选择最后一个。

一个建议:

N      = 1000 #average size of one record
File.open(filename){|f|
  puts "Get approx. get last 5 records"
  f.seek(-(5*N), IO::SEEK_END  )
  tail = f.read
  last_record = tail.split('----------').last
}