是否有一种优雅的方法来解析文本文件*向后*?

时间:2011-07-31 16:07:15

标签: ruby

  

可能重复:
  How to read a file from bottom to top in Ruby?

在处理我的Ruby程序的过程中,我得到了Eureka Moment,如果我能够向后解析文本文件而不是向前解析它会更简单。

似乎简单地将文本文件逐行读入数组,然后将行向后写入文本文件,将此临时文件向前解析(现在实际上 < / em>向后)进行任何必要的更改,将生成的行重新编入数组,然后再次向后写入它们,恢复原始方向,然后将修改保存为新文件。

虽然理论上可行,但我在实践中看到了几个问题,其中最大的问题是,如果文本文件的大小非常大,单个数组将无法一次保存整个文档

是否有更优雅的方式来完成向后阅读文本文件?

6 个答案:

答案 0 :(得分:3)

如果您没有使用大量UTF-8字符,则可以使用Elif库,其工作方式与File.open类似。只需加载Elif并将File.open替换为Elif.open

Elif.open('read.txt', "r").each_line{ |s|
    puts s
}

这是一个很棒的图书馆,但我现在遇到的唯一问题是它有几个问题,行以UTF-8结尾。我现在必须重新思考一种迭代我的文件的方法


其他详细信息

正如我谷歌一种方法来回答这个问题的UTF-8反向文件读取。我找到了一种已经由文件库实现的方法:

要向后读取文件,您可以尝试使用ff代码:

File.readlines('manga_search.test.txt').reverse_each{ |s|
   puts s
}

这也可以做得很好

答案 1 :(得分:2)

Ruby数组没有软件限制。但是有一些内存限制:Array size too big - ruby

如果您可以将所有内容读入内存,在那里运行并将其写回磁盘,那么您的方法将更快地运行。假设文件当然适合记忆。

答案 2 :(得分:2)

假设您的线条平均宽度为80个字符,并且您想要读取100行。如果你想要高效(而不是用最少量的代码实现),那么从末尾返回80 * 100字节(使用seek和“relative to end”选项),然后读取一行(这可能是一个部分,所以扔掉它)。通过tell记住您当前的位置,然后阅读所有内容直至结束。

现在你的内存中有多于或少于100行。如果更少,请返回(100 + 1.5 * no_of_missing_lines)* 80,并重复上述步骤,但只能读取行,直到您从之前的记忆位置开始。冲洗并重复。

答案 3 :(得分:2)

如何直到文件的末尾并向后迭代每个字符,直到你到达换行符,读取该行,依此类推?不优雅,但肯定有效。

示例:https://gist.github.com/1117141

答案 4 :(得分:0)

我想不出一种优雅方式来做这么不寻常的事情,但你可以使用file-tail库来做。它使用Ruby中的随机访问文件向后读取它(你甚至可以自己动手,在this link寻找随机访问)。

答案 5 :(得分:0)

你可以在整个文件中转发一次,只存储每个\ n的字节偏移量,而不是存储每行的完整字符串。然后,您向后遍历偏移数组,并可以使用ios.sysseek和ios.sysread从文件中获取行。除非您的文件真的很大,否则应该可以缓解内存问题。

无可否认,这绝对不符合优雅测试。