0

ファイルから 100 個の単語を読み取り、処理したいと考えています。

追加のカウンターなどを追加することはできますが、これを行うIOライブラリの1つにビルド内コマンドがあります。私はそれを見つけることができませんでした

   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」を使用する必要があります

より良い、eachenumerable -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

多分それはもっと簡単です:

File.open(filename) do |file|
  do_things(100.times.map{file.gets ' '}) until file.eof?
end
于 2012-06-10T01:34:02.140 に答える
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

1 行に 1 語で、ファイル全体をメモリに丸呑みできると仮定すると、次のようになります。

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 に答える