Как сравнить массив с последним вставленным массивом в csv-файле?

#ruby #arrays #csv

#ruby #массивы #csv

Вопрос:

Я создаю массивы, которые добавляю в файл с помощью:

 require 'csv`
CSV.open(FILE_NAME, "a ") do |csv|
  csv << array
end
 

Я хочу пропустить вставку, если значение индекса [0] идентично значению последнего вставленного массива [0] .

Как я могу прочитать последнюю строку / строку CSV-файла и сравнить его значения с массивом, который все еще не вставлен?

Комментарии:

1. Я не вижу элегантного способа сделать это эффективно. Либо вам придется читать весь CSV-файл при каждом добавлении, что ужасно неэффективно (O (n ** 2) по количеству строк), либо вам придется расширить CSV класс, чтобы запомнить последнюю строку, которая была добавлена к нему, но для этого потребуется изменить семантику ваш код довольно значителен. В любом случае, вам следует уточнить, откуда вы хотите, чтобы вы array пришли.

Ответ №1:

Работаем над некоторыми из того, что сказал @Patru:

 require 'csv'

csv = CSV.open(FILE_NAME, "a ")
first_row = csv.first
csv.rewind
last_row = csv.reverse_each.first


csv << ary unless ary == first_row or ary == last_row
 

Комментарии:

1. Это выглядит намного лучше, чем я думал. Я не знал об #reverse_each этом и не хотел его искать. Обратите внимание на это, и если вы добавите некоторые unless array[0] == last_row[0] , вы можете полностью решить проблему @Numbers.