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
'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 ... ' –
Wie groß werden die Dateien gelesen? Haben Sie mehr Dateien, die Treffer sind als Fehler, oder das Gegenteil, oder eine gleichmäßige Verbreitung? –
Ziemlich gleichmäßig zu verbreiten und sie sind in den unteren Hunderten derzeit so nichts zu groß –