2016-08-04 21 views
0

Mein Endziel ist es, Werte aus einer Datei mit den Datensätzen zu vergleichen, die ich aus einer Datenbank zurückhole.Ruby Zeichenfolge mit Dateiinhalt vergleichen

Ich habe eine Textdatei mit folgenden Struktur:

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

ich dann zurückziehen Datensätze aus einer Datenbank und Schleife durch sie eines nach der anderen.

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 

so baut Validate mir den gleichen Format-String gemäß den obigen Beispielen ... ich dann alle Zeilen der Datei lesen und sie in ein Array bewegen und dann vergleichen. Das ist also großartig, es gibt mir alle Übereinstimmungen, aber sagt mir nicht, Zeilen, die nicht in der Datei existieren?

So alternativ habe ich versucht,

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 

Aber das liest dann jede Zeile für jede Zeile und vergleicht so die Hälfte es erreicht, was ich bin nach.

Also ich möchte meine 'validate' Zeichenfolge und lesen Sie den Inhalt der Datei, um zu sehen, ob eine Zeile übereinstimmt und dann ausdrucken, es ist eine Übereinstimmung. Alternativ, wenn ich einen Datensatz zurückziehe und es nicht mit der Datei übereinstimmt, dann möchte ich nur, dass eine Nachricht nicht übereinstimmt.

Dank

+0

'Namen = File.readlines ('results.txt')' oder 'File.open ('Ergebnisse')' in einer Schleife eine schlechte Idee, weil es CPU-/Festplattenzeit verschwendet. Lesen Sie die Daten außerhalb der Schleife und greifen Sie dann auf die Variable innerhalb der Schleife zu. 'File.foreach (...)' ist einfacher und klarer als 'File.open (...) do | f | f.each_line do ... ' –

+0

Wie groß werden die Dateien gelesen? Haben Sie mehr Dateien, die Treffer sind als Fehler, oder das Gegenteil, oder eine gleichmäßige Verbreitung? –

+0

Ziemlich gleichmäßig zu verbreiten und sie sind in den unteren Hunderten derzeit so nichts zu groß –

Antwort

0

Ich würde versuchen, die folgenden

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!