在处理我的Ruby程序的过程中,我得到了Eureka Moment,如果我能够向后解析文本文件而不是向前解析它会更简单。
似乎简单地将文本文件逐行读入数组,然后将行向后写入文本文件,将此临时文件向前解析(现在实际上 < / em>向后)进行任何必要的更改,将生成的行重新编入数组,然后再次向后写入它们,恢复原始方向,然后将修改保存为新文件。
虽然理论上可行,但我在实践中看到了几个问题,其中最大的问题是,如果文本文件的大小非常大,单个数组将无法一次保存整个文档
是否有更优雅的方式来完成向后阅读文本文件?
答案 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)
如何直到文件的末尾并向后迭代每个字符,直到你到达换行符,读取该行,依此类推?不优雅,但肯定有效。
答案 4 :(得分:0)
答案 5 :(得分:0)
你可以在整个文件中转发一次,只存储每个\ n的字节偏移量,而不是存储每行的完整字符串。然后,您向后遍历偏移数组,并可以使用ios.sysseek和ios.sysread从文件中获取行。除非您的文件真的很大,否则应该可以缓解内存问题。
无可否认,这绝对不符合优雅测试。