2016-08-04 6 views
0

私の最終目標は、ファイルの値をデータベースから取り戻しているレコードと比較することです。ruby​​ファイルの内容と文字列を比較する

私は、次のような構造を持つテキストファイルがあります:私は、一つ一つそれらを介してデータベースとループからレコードを引き戻す

123,55,66 
555,99,109 
324,100,800 
467,200,300 

を。

sth.fetch do |row| 
    validate = "#{row[0]},#{row[20]},#{row[21]}" 
    names = File.readlines('results.txt') 
    matches = names.select { |name| name[/#{validate}/i] } 
    p "Result matches as expected: #{matches}" 
end 

したがって、上記の例と同じフォーマット文字列を作成します。次に、ファイルのすべての行を読み取り、配列に移動して比較します。だから、これは私にすべてのマッチを与えるが、ファイルに存在しない行を私に教えてくれないのは素晴らしいことですか?

だから代わりに私が

sth.fetch do |row| 
     File.open('results') do |f| 
     f.each_line do |line| 
      if line == validate 
      puts "detail: #{line}" 
      else 
      puts "detail: #{validate}" 
      end 
     end 
     end 
end 

を試してみました。しかし、これはその後、すべての行に対して、各行を読み取り、それは半分私が後だものを実現して比較します。

私は 'validate'文字列を取得し、ファイルの内容を読み込んで行が一致するかどうかを確認し、一致するものを出力したいと考えています。あるいは、レコードを取り戻してもそれがファイルと一致しない場合は、メッセージに一致しないようにするだけです。

おかげ

+0

をしようとするだろう= File.readlines( 'RESULTS.TXT')'や 'File.open( '結果')'ループ内にありそれはCPU /ディスクの時間を無駄にしているので、悪い考えです。ループ外のデータを読み取り、ループ内の変数にアクセスします。 'File.foreach(...)'は 'File.open(...)do | f |より簡単で明瞭です。 f.each_line do ... ' –

+0

ファイルはどれくらい読み込まれていますか?あなたはミスよりも多くのファイルを持っていますか、それとも逆のファイルですか、あるいはスプレッドですか? –

+0

かなり広がっていて、現在は何百もの人がいないので、あまりにも大きい –

答えて

0

私は `の名前を使用して、次の

names = File.readlines('results.txt').map(&:chomp) 
sth.fetch do |row| 
    validate = "#{row[0]},#{row[20]},#{row[21]}" 

    # for direct compare 
    # if names.include?(validate) 
    # Or for Regexp 
    if names.grep(/#{validate}/i).any? 
     p "Result matches as expected: #{matches}" 
    else 
     p "Result does not matches as expected: #{matches}" 
    end 
end 

all_matches.uniq! 
関連する問題