Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用ruby前后读取文件?_Ruby_File - Fatal编程技术网

如何使用ruby前后读取文件?

如何使用ruby前后读取文件?,ruby,file,Ruby,File,我有一些svn日志文件,它们有几kb到1MB,通常是kb。它们包含零个、一个或多个以下文本块: --------------------------------- r3457 | programmer1 | 03.20.2015 changed file1.txt added file7.txt etc... team1: adding new feature to app --------------------------------- 我想获得每个文件中的最后一次签入。在上面的示例中,最

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

---------------------------------
r3457 | programmer1 | 03.20.2015
changed file1.txt
added file7.txt
etc...
team1: adding new feature to app
---------------------------------
我想获得每个文件中的最后一次签入。在上面的示例中,最后一次签入是3457

所以,对于这个,我将从底部读取一个文件,继续向上读取,直到找到一条虚线。然后,我将向前看下一行,这是最后一次签入

我该怎么做?我读了一点关于
elif
的书,但没有弄清楚api。我也试过一个这样的帖子,但不清楚-

我可以这样做,但我不想将它写入另一个文件

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

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

万分感谢

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

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个字节(参见
字节
之前的负号)并打印它

只需估计一条记录的大小,并尝试读取最后的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
}

很少kb到1MB,无需进行复杂的字节级文件读取。只需读取数组中的线,并使用
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

假设记录大小最多为
n
。您可以打开文件并定位
大小(文件名)-n
(使用)并查找文件中该点的最后一条记录。为什么不在向后读取时保留读取的行?为什么不使用
file.readlines('test.txt')
而不是
file.open(“test.txt”)。readlines
?这也是
slice\u before
的一个很好的候选者,比如
ar.slice\u before(/^-+$/)。last.split…
,但是应该运行一个基准测试,看看一种方法是否比另一种方法有好处。
File.readlines('test.txt')
肯定是一种改进,谢谢。出于可读性和可维护性的原因,我倾向于避免使用正则表达式;太多的人将它们作为他们的工具,然后编写运行较慢或引入极其微妙的bug的代码。如果使用和编写正确,它们还可以减少代码并提高速度。只有一个时间和地点可以使用它们。@steenslag-很好的答案。唯一的问题是,当破折号的数量固定时,这将起作用。假设它发生了变化,那么代码将无法工作。如果至少有10个破折号,如何使上述代码工作?谢谢,我不想看大概的记录。我只想反向读取一个文件,一次只读取一行。我也希望能够前进,一次一行。