0

我想从文件中读取 100 个单词,然后处理它们。

我可以添加额外的计数器等,但是在执行此操作的 IO 库中是否有内置命令。我找不到它

   require 'pp'
arr = []
i = 0
f=File.open("/home/pboob/Features/KB/178/synthetic/dataCreation/uniqEnglish.out").each(" ") { |word|
  i=i+1
  arr << word
  if i==100
    pp arr
    arr.clear
    i=0
  end
}
pp arr

谢谢!

PS:文件太大,内存放不下,所以我将不得不使用“.each”

4

4 回答 4

2

该文件太大而无法放入内存,所以我将不得不使用“.each”

each, 懒惰与enumerable-lazy更好:

require 'enumerable/lazy'
result = open('/tmp/foo').lines.lazy.map(&:chomp).each_slice(100).map do |group_of_words|
  # f(groups_of words)
end

更多关于函数式编程和懒惰的信息

于 2012-06-09T18:38:13.610 回答
0

假设每行一个单词,并且能够将整个文件吞入内存:

IO.readlines('/tmp/foo').map(&:chomp).each_slice(100).to_a

如果您受内存限制,那么您可以通过仅指定块大小来对块进行交互;无需柜台!

File.open('/tmp/foo') do |f|
  chunk = []
  f.each do |line|
    chunk.push(line)
    next unless f.eof? or chunk.size == 100
    puts chunk.inspect
    chunk.clear
  end
end

这非常冗长,尽管它确实清楚地说明了分块发生了什么。如果您不介意不那么明确,您仍然可以使用带枚举器的切片:

File.open('/tmp/foo').lines.map(&:chomp).each_slice(100) {|words| p words}

并用您想要对每个块执行的任何处理替换该块。

于 2012-06-09T18:25:16.213 回答
0

实际上,我相信“each_slice”的实现对于您的目的来说已经足够懒惰了。尝试这个:

open('tmp/foo').lines.each_slice(100) do |lines|
  lines = lines.collect &:chomp   # optional
  # do something with lines
end

不像 tokland 的解决方案那样优雅,但它避免了向您的应用程序添加额外的依赖项,这总是很好。

我认为这可能对你有用: http ://blog.davidegrayson.com/2012/03/ruby-enumerable-module.html

于 2012-06-09T19:02:52.463 回答
0

也许这样做更简单:

File.open(filename) do |file|
  do_things(100.times.map{file.gets ' '}) until file.eof?
end
于 2012-06-10T01:34:02.140 回答