#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.