2016-08-04 2 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 

так Validate строит мне ту же самую строку формата согласно приведенным выше примерам ... потом я прочитал все строки файла и переместить их в массив, а затем сравнить. Так что это здорово, что он дает мне все совпадения, но не говорит мне строк, которых нет в файле?

Так в качестве альтернативы я попытался

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 ('Результаты')' в петле плохая идея, потому что она тратит время процессора/диска. Прочитайте данные за пределами цикла, затем обратитесь к переменной внутри цикла. '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!