ruby - 懒洋洋地逐段阅读文件

标签 ruby lazy-evaluation

我将一些数据存储在一个文件中,其中每个感兴趣的 block 都存储在一个段落中,如下所示:

hello
there

kind

people
of

stack
overflow

我试过用下面的代码阅读每一段,但它不起作用:

paragraphs = File.open("hundreds_of_gigs").lazy.to_enum.grep(/.*\n\n/) do |p| 
  puts p
end

我想用正则表达式说:“匹配任何以两个换行符结尾的东西”

我做错了什么?

解决此问题的任何懒惰方法表示赞赏。方法越简洁越好。

最佳答案

IO#readline("\n\n")会做你想做的。 FileIO 的子类,并且拥有它的所有方法,即使它们没有在 File ruby​​doc 页面上说明。

它逐行读取,行尾是给定的分隔符。

例如:

f = File.open("your_file")
f.readline("\n\n") => "hello\nthere\n\n"
f.readline("\n\n") => "kind\n\n"
f.readline("\n\n") => "people\nof\n\n"
f.readline("\n\n") => "stack\noverflow\n\n"

每次调用 readline lazy 从顶部开始读取文件的一行。

或者您可以使用 IO#each_line("\n\n")遍历文件。

例如:

File.open("your_file").each_line("\n\n") do |line|
  puts line
end

=> "hello\nthere\n\n"
=> "kind\n\n"
=> "people\nof\n\n"
=> "stack\noverflow\n\n"

关于ruby - 懒洋洋地逐段阅读文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27420702/

相关文章:

ruby-on-rails - Ruby Hash 包含单个键的额外值

ruby-on-rails - 在 Rails 应用程序中加密二进制文件最节省内存的方法?

performance - 为什么在本例中使用序列比使用列表慢得多

haskell - 批量(串联)延迟消耗日志文件行

scala - 覆盖值的行为的原理

haskell - 什么是脊椎僵硬

ruby - 如何查找并计算所有重复的 2/3/4 单词短语

ruby - 通过 Homebrew 软件安装了 memcached,如何启动和停止服务器?

ruby-on-rails - 我如何在 Rails 中创建一个人类可读的 datediff

java - 在流中使用 Java 8 Supplier 实现惰性求值